簡體   English   中英

如何在Octave / Matlab中將“ .mat”文件作為參數傳遞

[英]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.matinput3.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一大優勢在於,如果您想測試或調試它,它會突然變得容易得多。 如果文件加載/保存在函數內部,並且您想對其進行測試,則必須

  1. 創建測試數據
  2. 將測試數據保存到文件
  3. 使用文件名作為輸入運行processData
  4. 加載包含輸出數據的文件
  5. 檢查輸出數據是否正確
  6. 切記從任何地方清除包含測試數據的文件

如果您將數據加載/保存與處理分開,那么您的測試過程將變為

  1. 創建測試數據
  2. 以測試數據為輸入運行processData
  3. 檢查輸出是否正確

簡單得多,而且您不必在任何時候都忙於保存/加載文件,也無需在硬盤驅動器上創建任何混亂的文件。 如果您需要進行任何調試,則過程也將更加容易-只需創建一個函數將失敗的示例,然后逐步執行代碼以查看其實際失敗的地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM