如何将此脚本转换为MATLAB函数?
clear all;
set={AB02XY_1,ZT99ER_1,UI87GP_1};
fileData1 = load([fileString set{1} '.mat']);
fileData2 = load([fileString set{2} '.mat']);
fileData3 = load([fileString set{3} '.mat']);
[A,B] = myfunction1_1(fileData1,fileData2,fileData3);
fileName = 'C:\Users\Documents\MATLAB\matrice_AAA001.mat';
save(fileName,'A','B');
clear all;
set={AB02XY_2,ZT99ER_2,UI87GP_2};
fileData1 = load([fileString set{1} '.mat']);
fileData2 = load([fileString set{2} '.mat']);
fileData3 = load([fileString set{3} '.mat']);
fileData4 = load('C:\Users\Documents\MATLAB\matrice_AAA001.mat');
[A,B] = myfunction1_2(fileData1,fileData2,fileData3,fileData4);
fileName = 'C:\Users\Documents\MATLAB\matrice_AAA001.mat';
save(fileName,'A','B');
我对大数据文件进行处理,然后为了避免错误“内存不足”,我将每个文件分成两部分,并在每个阶段的开头使用'clear all'。所以,我想要的是一个函数AAA001 = function (AB02XY, ZT99ER, UI87GP, MyFunction1)
。
我的问题是我必须为其他数据文件编写相同的脚本。那么,有没有办法构建一个函数,我只需要更改文件名AB02XY,ZT99ER,UI87GP,并使用'MyFunction1'函数的名称进行子处理,以获得文件AAA001的最后一步。 / p>
注意:我简化了我的脚本,但实际上我将每个文件分为5个部分。所以我想在一个函数中转换我脚本的5个部分!!!
感谢您的帮助。
答案 0 :(得分:1)
这是一种方法。调用函数
output = function ({'AB02XY', 'ZT99ER', 'UI87GP'}, 5, MyFunction1);
请注意,我假设您需要5个文件部分
function out = myMainFunction(fileList, nParts, fun2run)
%# myMainFunction calculates output from multiple split files
%
%# SYNOPSIS out = myMainFunction(fileList, nParts, fun2run)
%#
%# INPUT fileList: cell array with file body names, e.g.
%# 'AB02XY' for files like 'AB02XY_1.mat'
%# nParts : number of parts in which the files are split
%# fun2run : function handle or name. Function has to
%# accept lenght(fileList) arguments plus one
%# that is the output of the previous iteration
%# which is passed as a structure with fields A and B
%#
%# OUTPUT out : whatever the function returns
%#
%# Brought to you by your friends from SO
%# input checking should go here
if ischar(fun2run)
fun2run = str2func(fun2run);
end
nFiles = length(fileList);
for iPart = 1:nParts
data = cell(nFiles,1);
for iFile=1:nFiles
data{iFile} = load(sprintf(%s_%i.mat',fileList{iFile},iPart));
end
if iPart == 1
%# call fun2run with nFiles inputs
[out.A,out.B] = fun2run(data{:});
else
%# fun2run wants the previous output as well
[out.A,out.B] = fun2run(data{:},out);
end
end %# loop parts
答案 1 :(得分:0)
如果我理解正确,这个函数的主要挑战是正确组装文件名,并传递应该调用的函数,对吧?如果将数据文件的名称作为字符串传递,则可以使用sprintf汇编文件名,如:
dataSetName = 'AAA001';
dataFilename = sprintf('C:\path\to\datafolder\%s.mat', dataSetName);
对于该功能,您可以将function handle作为参数传递给您的函数。例如,考虑定义一个函数:
function c = apply_fun(fun, a, b)
c = fun(a, b);
end
例如,您可以将max
或mean
视为func,如下所示:
>> apply_fun(@max, 1, 2)
ans =
2
>> apply_fun(@min, 1, 2)
ans =
1
即,传递max
的引用(使用@max
),然后在我们定义的apply_fun
函数中使用它。
此外,您在函数内部不需要clear all
,因为它已经有另一个范围。
希望这能帮到你!