您的变量在每次运行时都被“覆盖”的原因是每个函数(或独立程序)都有自己的局部变量所在的工作区,并且当函数(或独立程序)返回时这些局部变量不再存在/终止。为了保留变量的值,您必须从函数中返回它。由于 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 的大小随着调用而增长,从而保存了每次运行的输出。如果要保存多个变量或数组,请执行相同的操作(对于数组,您始终可以为此目的引入一个多维的输入/输出数组,但您可能必须使用显式索引而不是仅仅推动下一个 @987654326 @ 值到你的向量的底部)。
请注意,如果您的输入/输出数组最终变大,那么您将花费大量时间来继续按小块分配必要的内存。然后,您可以选择分配 EFvec(或等效)数组而不是将其初始化为 [],并引入一个计数器变量,告诉您在哪里覆盖下一个数据点。
免责声明:我所说的函数工作区仅适用于局部变量。您还可以在函数和工作区中定义global EFvec,然后您不必将其传入和传出函数。由于我还没有看到实际需要使用global 变量的问题,因此我会避免使用此选项。然后您还有persistent 变量,它们基本上是globals,其范围仅限于自己的工作区(如果您想了解更多信息,请在MATLAB 中运行help global 和help persistent,这些帮助页面提供了令人惊讶的信息与通常的帮助条目相比)。
假设您的程序是一个独立(已部署)的程序
虽然我对独立的 MATLAB 程序没有任何经验,但在我看来,要做到这一点很难。 A MathWorks Support answer 建议您可以将变量传递给独立程序,但只能像传递给 shell 脚本一样。我的意思是你必须传递文件名或明确的数字(但这是有道理的,因为首先没有 MATLAB 工作区)。这意味着为了保留程序的累积输出集,您可能必须将它们存储在文件中。这可能不是那么痛苦:打开一个文件来追加下一组数据很简单(我不知道效率等问题,无论如何这一切都取决于我们有多少数据和你的函数运行多少次谈论)。