我必须处理大量数据并多次运行相同的MATLAB程序,每次运行程序时,它都会将数据存储在相同的预设变量中。问题是,每次运行程序时都会覆盖和替换值,这很可能是因为所有变量都是double类型而不是矩阵。我知道如何创建一个可以在程序中存储多个值的变量,但仅限于程序运行一次。
这是我能够提供的代码:
volED = reconstructVolume(maskAlignedED1,maskAlignedED2,maskAlignedED3,res)
volMean = (volED1+volED2+volES3)/3
strokeVol = volED-volES
EF = strokeVol/volED*100
我正在运行的程序取决于此时我无法提供的更多MATLAB文件,但我相信在此瞬间创建了双变量strokeVol和EF。如何创建一个存储多个值的变量,并在每次运行程序时不断添加值?
答案 0 :(得分:0)
您的变量被覆盖的原因"每次运行都是每个函数(或独立程序)都有自己的工作空间,局部变量位于其中,当函数(或独立程序)返回/终止时,这些局部变量不再存在。为了保留变量的值,您必须从函数中返回它。由于MATLAB通过值(而不是引用)传递其变量,因此如果要在调用工作空间中拥有累积数据集,则必须显式提供向量(或更一般地,数组)作为函数的输入和输出。但这一切都取决于你是否有一个功能或部署的程序。
如果您的函数现在声明为
function strokefraction(inputvars)
您可以将其定义更改为
function [EFvec]=strokefraction(inputvars,EFvec)
%... code here ...
%volES initialized somewhere
volED = reconstructVolume(maskAlignedED1,maskAlignedED2,maskAlignedED3,res);
volMean = (volED1+volED2+volES3)/3;
strokeVol = volED-volES;
EF = strokeVol/volED*100;
EFvec = [EFvec; EF]; %add EF to output (column) vector
请注意,输入和输出变量具有相同的名称是合法的。现在,当你每次调用你的函数(从MATLAB或其他函数),你将向量添加到它的调用,如下所示:
EFvec=[]; %initialize with empty vector
for k=1:ndata %simulate several calls
inputvar=inputvarvector(k); %meaning that the input changes
EFvec=strokefraction(inputvar,EFvec);
end
您将看到EFvec
的大小从一个调用到另一个调用增长,从而保存每次运行的输出。如果要保存多个变量或数组,请执行相同的操作(对于数组,您总是可以为此目的引入一个具有一个维度的输入/输出数组,但您可能必须使用显式索引而不是仅仅推送下一个{{ 1}}值到向量的底部)。
请注意,如果您的输入/输出数组最终变大,那么将花费大量时间来通过小块继续分配必要的内存。然后,您可以选择分配EF
(或等效)数组,而不是将其初始化为EFvec
,并引入一个计数器变量,告诉您在哪里覆盖下一个数据点。
免责声明:我所说的功能工作区仅适用于局部变量。您还可以在函数和工作区中定义[]
,然后您不必将其传入和传出函数。由于我还没有看到实际需要使用global EFvec
变量的问题,我会避免使用此选项。然后你还有global
个变量,它们基本上是persistent
个,其范围仅限于它们自己的工作空间(如果你愿意,可以在MATLAB中运行global
和help global
要了解更多信息,与常规帮助条目相比,这些帮助页面的信息量令人惊讶。)
虽然我对单独的MATLAB程序没有任何经验,但在我看来,要做到这一点很难做到。 A MathWorks Support answer表示您可以将变量传递给独立程序,但仅限于传递给shell脚本。我的意思是你必须传递文件名或显式数字(但这是有道理的,因为首先没有MATLAB工作区)。这意味着,为了保留程序的累积输出集,您可能必须将它们存储在文件中。这可能不是那么痛苦:打开一个文件来附加下一组数据很简单(我不知道效率等问题,而且这一切都取决于我们和我们的功能有多少数据和运行次数#39;重新谈论。)