【问题标题】:How do i save my output array from a loop?如何从循环中保存输出数组?
【发布时间】:2017-09-25 11:17:32
【问题描述】:

我有一个循环,它为每次迭代输出变量A 作为mx1 matrix (where: m>1)。在整个循环结束时,A 将最终成为mxn matrix。尽管输出以mxn 矩阵的形式返回,但它会不断覆盖结果。我已经尝试了很多东西(包括那些适用于我以前的代码的东西),但似乎没有一个有效。不过,我觉得下面的代码应该可以工作,但我不确定错误来自哪里。

x_A = NaN(28, 3); % 28=length of A and 3=length of kk
Z = [1,2,4,7];

for kk = 1: numel(Z)
   [A,B,C] = fsave_output(Z, kk)
   x_A     = [x_A(:,kk) A(:,kk)];

   % repeat the line above for B and C

end

当我运行它时,我收到错误消息:“尝试访问 x_A(:,3); index out of bounds because size(x_norm)=[28,2].”。但是,x_A(:,1) 和 X_A(:,2) 中的输出是正确的,只是 x_A(:,3) 没有显示。

关于我应该在这里做什么的任何想法/建议/帮助?非常感谢!

【问题讨论】:

  • 您确定 A 在每次循环迭代中的大小都相同吗?像x_A = [x_A; [A]]; 这样的存储会大大降低代码速度,请使用预分配。
  • 感谢@Gryphon 的回复。就像我说的,我在书中尝试了很多技巧。另外,对于您问题的第一部分; A 在每次迭代时肯定具有相同的大小。
  • 在更新的代码中,每次循环迭代都会调整 x_A 数组的大小,因此在 kk = 3 时会出现错误,因为此时 x_A 为 28x2
  • 哦,真的!,有什么建议可以解决这个问题吗?谢谢!
  • x_A(:,kk) = A;

标签: arrays matlab concatenation


【解决方案1】:

如果您知道循环前要存储的矩阵的大小,请尝试

Z = [1,2,4,7];
store_A = zeros(numel(Z), m); %m is known length
store_B = zeros(numel(Z), m); %if not known, unroll first iteration of loop
store_С = zeros(numel(Z), m); %or store it in a cell and concatenate after the loop

for kk = 1: numel(Z)
   [store_A(kk,:),store_B(kk,:),store_C(kk,:)] = fsave_output(Z, kk)
end

【讨论】:

  • 非常感谢@Gryphon。这会在函数“fsave_output”中引发错误。不过,我尝试了一些似乎更接近预期结果的方法。请查看已编辑的问题。
猜你喜欢
  • 2017-06-18
  • 2017-08-06
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 2019-03-30
  • 2018-05-24
相关资源
最近更新 更多