[英]How to load a .mat file and set the variable name in Octave or Matlab?
[英]How to pass a “.mat” file as an argument in Octave/Matlab
我有許多.mat文件。 我寫了一個簡短的腳本,在其中我使用file1.mat並分析了數據。 該過程的下一步將是對file2.mat做同樣的事情。 一種方法是簡單地復制我以前的代碼,並用“ file2.mat”替換所有的“ file1.mat”,然后對3,4進行同樣的操作。但是,我覺得必須有一個更優雅的解決方案。 最佳情況是,如果我可以編寫一個以文件名(最好不是整個路徑)作為參數的函數。 這可能嗎?
我已經搜尋了網絡,而我得到的最接近的是“ feval”功能,如果我有.m文件,但對於.mat文件則根本不起作用。
有沒有一種方法可以將.mat文件傳遞給Matlab函數?
假設您有以下腳本,該腳本僅加載一些.mat文件並處理兩個變量-
load('C:\data\input1.mat'); %// loads x, y into the workspace
z = x + y;
save('C:\data\output1.mat', 'z');
並且您還希望處理input2.mat
, input3.mat
等。最好的方法是編寫一個函數,將所有這些工作包裝成一個整潔的blob-
function processData(fnameIn, fnameOut)
pathIn = fullfile('C:\data', fnameIn);
pathOut = fullfile('C:\data', fnameOut);
load(pathIn); %// loads x, y into the workspace
z = x + y;
save(pathOut, 'z');
end
現在您可以這樣稱呼它
processData('input1.mat', 'output1.mat')
processData('input2.mat', 'output2.mat')
等,甚至更好
inputNames = {'input1.mat', 'input2.mat' };
outputNames = {'output1.mat', 'output2.mat'};
for i = 1:length(inputNames)
processData(inputNames{i}, outputNames{i});
end
或者,如果您的文件名恰好是結構化的,則可以
for i = 1:2
infile = sprintf('input%d.mat', i);
outfile = sprintf('output%d.mat', i);
processData(infile, outfile);
end
另一種可能的解決方案是編寫您的函數,使其根本不執行任何文件加載或保存操作,而是接收一些數據作為輸入,並將其作為輸出返回。 這更加靈活,因為現在您可以控制訪問數據的方式(例如,也許您希望在處理任何數據之前將其全部加載到工作區中-您現在就可以這樣做,而在數據加載,處理和保存之前捆綁在一起)。 processData
函數如下所示
function dataOut = processData(dataIn)
x = dataIn.x;
y = dataIn.y;
dataOut.z = x + y;
end
如果您要加載文件然后一次處理一個文件,可以像這樣使用它,
for i = 1:length(inputNames)
dataIn = load(fullfile('C:\data', inputNames{i}));
dataOut = processData(dataIn);
save(fullfile('C:\data', outputNames{i}), '-struct', 'dataOut');
end
或類似這樣,如果您想進行所有加載,然后進行所有處理,然后進行所有保存-
for i = 1:length(inputNames)
dataIn(i) = load(fullfile('C:\data', inputNames{i}));
end
for i = 1:length(inputNames)
dataOut(i) = processData(dataIn);
end
for i = 1:length(inputNames)
tmp = dataOut(i);
save(fullfile('C:\data', outputNames{i}), '-struct', 'tmp');
end
以這種方式編寫processData
一大優勢在於,如果您想測試或調試它,它會突然變得容易得多。 如果文件加載/保存在函數內部,並且您想對其進行測試,則必須
processData
如果您將數據加載/保存與處理分開,那么您的測試過程將變為
processData
簡單得多,而且您不必在任何時候都忙於保存/加載文件,也無需在硬盤驅動器上創建任何混亂的文件。 如果您需要進行任何調試,則過程也將更加容易-只需創建一個函數將失敗的示例,然后逐步執行代碼以查看其實際失敗的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.