Как я могу преобразовать этот скрипт в функцию MATLAB? - PullRequest
0 голосов
/ 03 апреля 2011

Как я могу преобразовать этот скрипт в функцию 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');

Я выполняю обработку больших файлов данных, затем, чтобы избежать ошибки «недостаточно памяти», я разделяю каждый файл на две части иЯ использую в начале каждого этапа «очистить все».Итак, я хочу иметь функцию AAA001 = function (AB02XY, ZT99ER, UI87GP, MyFunction1).Моя проблема в том, что я должен написать тот же сценарий для других файлов данных.Итак, есть ли способ создать функцию, где я могу просто изменить имена файлов AB02XY, ZT99ER, UI87GP и имя функции, использованной «MyFunction1» для дополнительной обработки, чтобы получить на последнем шаге файл AAA001.

Примечание: я упростил свой скрипт, но на самом деле я делю каждый файл на 5 частей.Поэтому я хочу превратить 5 частей моего сценария в одну функцию !!!

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Вот один из способов сделать это.Вызовите функцию

 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
0 голосов
/ 03 апреля 2011

Если я правильно понимаю, основные проблемы в этой функции - правильно собрать имена файлов и передать функцию, которая должна быть вызвана, верно?Если вы передаете имя файла данных в виде строки, вы можете использовать sprintf для сборки имени файла, например:

dataSetName = 'AAA001';
dataFilename = sprintf('C:\path\to\datafolder\%s.mat', dataSetName);

Для функции вы можете передать дескриптор функции какпараметр вашей функции.Например, предположим, что вы определили функцию:

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 внутри функции, поскольку она ужеимеет другую область.

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...