【问题标题】:Adding Multiple Values to a Variable in MATLAB在 MATLAB 中向变量添加多个值
【发布时间】:2015-07-28 18:44:33
【问题描述】:

我必须处理大量数据并多次运行同一个 MATLAB 程序,并且每次运行该程序时,它都会将数据存储在相同的预设变量中。问题是,每次运行程序时,这些值都会被覆盖和替换,很可能是因为所有变量都是双精度类型并且不是矩阵。我知道如何制作一个可以在程序中存储多个值的变量,但仅限于程序运行一次时。

这是我能够提供的代码:

volED = reconstructVolume(maskAlignedED1,maskAlignedED2,maskAlignedED3,res)
volMean = (volED1+volED2+volES3)/3

strokeVol = volED-volES
EF = strokeVol/volED*100  

我正在运行的程序依赖于我目前无法提供的大量 MATLAB 文件,但是我相信双变量 strokeVol 和 EF 是在此时创建的。如何创建一个变量来存储多个值并在每次程序运行时不断添加值?

【问题讨论】:

  • 我想我不明白。这是一个交互式调用的 MATLAB 函数吗?或者它是在 MATLAB 之外运行的独立代码?无论如何,您的 volES 变量在您的摘录中未定义。如果我理解正确,您可能需要定义一个包含要保存的输出的向量,并且您必须更新它(通过将其作为函数的输入变量提供)并在每次运行时从程序返回。
  • 我根据我的最佳猜测添加了一个答案,但请随时修改您的问题以澄清问题。

标签: matlab variables matrix


【解决方案1】:

您的变量在每次运行时都被“覆盖”的原因是每个函数(或独立程序)都有自己的局部变量所在的工作区,并且当函数(或独立程序)返回时这些局部变量不再存在/终止。为了保留变量的值,您必须从函数中返回它。由于 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 globalhelp persistent,这些帮助页面提供了令人惊讶的信息与通常的帮助条目相比)。

假设您的程序是一个独立(已部署)的程序

虽然我对独立的 MATLAB 程序没有任何经验,但在我看来,要做到这一点很难。 A MathWorks Support answer 建议您可以将变量传递给独立程序,但只能像传递给 shell 脚本一样。我的意思是你必须传递文件名或明确的数字(但这是有道理的,因为首先没有 MATLAB 工作区)。这意味着为了保留程序的累积输出集,您可能必须将它们存储在文件中。这可能不是那么痛苦:打开一个文件来追加下一组数据很简单(我不知道效率等问题,无论如何这一切都取决于我们有多少数据和你的函数运行多少次谈论)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 2011-08-17
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多