【问题标题】:Error message when storing output from loop in matrix将循环的输出存储在矩阵中时出现错误消息
【发布时间】:2016-03-16 12:00:30
【问题描述】:

我有这个程序可以计算样本中每一天的实际协方差,但我在将输出存储在矩阵中时遇到了一些麻烦。

程序如下:

 for i=1:66:(2071*66)

vec = realized_covariance(datapa(i:i+65),data(i:i+65),datapo(i:i+65),data(i:i+65),'wall','Fixed',fixedInterval,5)

mat(2,4142) = vec

end

输出:

vec =

   1.0e-03 *

    0.1353   -0.0283
   -0.0283    0.0185

下标分配维度不匹配。

我尝试了各种方法将输出存储在矩阵中,例如在零上定义一个矩阵以将输出存储在其中,或者让存储矩阵的行维度未定义,但似乎没有任何作用。

我非常感谢有关如何应对这一挑战的建议。

【问题讨论】:

  • 您可以删除旧问题。
  • realized_covariance 不是本机 MATLAB 函数。请分享该函数的代码,以便我们为您提供帮助。
  • 大家好我不知道这个问题以前被问过?因为我搜索时它没有弹出。致 Adrian:我可以很容易地发布实现协方差计算的代码,但它不在这里我有问题。如果我只是运行程序而不想将输出存储在矩阵中,它会完美运行
  • @KristianNielsen:在 Stack Overflow 上的 MATLAB 标签中有 186 questions with that exact error
  • 我深表歉意,我应该考虑搜索错误消息,我很快就发布了我的问题。

标签: matlab loops for-loop matrix storing-data


【解决方案1】:

我使用了一个可以完成这项工作的解决方案。

我定义了一个矩阵,然后使用以下内容一次填充了我的所有输出:

A = zeros(0,0) %before loop, only serve to define the storing matrix

A = [A; vec]%after the calculating function, inside the loop.

【讨论】:

  • 这也是一种解决方法。对你有好处,你自己找到它!请注意,一个好的做法是在循环之前预先分配矩阵(就像在@Adriaan 和我的答案中一样),因为在每次迭代中增加它会消耗时间和内存。
  • 感谢您让我认识 Adiel。我实际上尝试过,但是当我这样做时,我的输出最终被加载到最后定义的行的 A 中。例如,我从将 A 定义为 A = zeros(2071,2) 开始,然后与上面相同,但最后我的输出从第 2071 行开始。我哪里搞砸了?
  • 问题是你照原样接受A,然后添加另一个数据。所以它需要所有的零并在之后添加vec。在我的回答中,我准确定义了数据应该在矩阵中的位置。
【解决方案2】:

实际上mat(2,4142) 是矩阵中的单个位置,您不能分配四个值。 每次要为其分配值时,都需要在 mat 中定义确切的位置。尝试这样做:

mat=zeros(2,2142);
for k=1:66:(2071*66)
  vec=realized_covariance(datapa(i:i+65),data(i:i+65),datapo(i:i+65),data(i:i+65),'wall','Fixed',fixedInterval,5)
  mat(:,[(((k-1)/66)*2)+1 (((k-1)/66)*2)+2])=vec;

end

【讨论】:

  • 嗨 Adiel 感谢您的回答,不幸的是,我仍然收到相同的错误消息。实现的协方差函数产生一个 2x2 矩阵,我需要最终得到一个 4142x2 矩阵,其中包含循环期间产生的所有输出。
  • @KristianNielsen 没错,我编辑了它。希望它现在可以工作!
【解决方案3】:

您正在尝试将2 x 2 矩阵存储到单个元素中。 IE。右侧4个元素,左侧1个。那不合适。像这样看:你的房子旁边有一个车库,可以停放 1 辆车。你有三个朋友过来,他们也想把车停在里面。这是一个问题,因为你只有一个空间。所以你必须买一个更大的车库:在左边分配 4 个元素(例如mat(ii:ii+1,jj:jj+1) = [1 2;3 4]),或者使用单元格/结构数组。

作为Steve suggests in a comment below,你可以很容易地使用3D矩阵:

counters = 1:66:(2071*66);
mat = zeros(2,2,numel(counters)); %// initialise output matrix
for ii=1:numel(counters)
    vec = realized_covariance(datapa(counters(ii):counters(ii+65)),...
    data(counters(ii):counters(ii+65)),datapo(counters(ii):counters(ii+65)),...
    data(counters(ii):counters(ii+65)),'wall','Fixed',fixedInterval,5)
    mat(:,:,ii) = vec; %// store in a 3D matrix
end

现在mat 是 3D,前两个坐标是您的常规输出,即vec,最后一个索引是迭代次数。因此,要访问迭代 1032 的输出,您可以使用 mat(:,:,1032),可能在其周围加上 squeeze 以使其成为 2D 而不是 3D。

【讨论】:

  • 我有点不确定如何实现这个 Adriaan,或者更正确地说,我不确定当循环产生输出时如何让矩阵增长。感谢您的回复
  • 对我来说使用下面的矩阵是很自然的; mat(:,1:2) 因为据我所知它是一个 nx2 矩阵,然后在其中分配每个输出。但这似乎并不正确。
  • @KristianNielsen 也许考虑一个2-by-2-by-N 矩阵,例如mat=zeros(2,2,2071) 那么如果vec2-by-2,则可以将其存储为mat(:,:,day_number)=vec
  • 嘿史蒂夫那我必须定义 day_number 对吗? f.x. day_number = 1 然后将其包含在我的循环中?最后得到类似: mat(:,:,day_number) = vec 并以:day_number = day_number + 1 结束,还是我错了?
  • @Adriaan ii 不是索引mat 的第三维的好计数器,因为它不是连续的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多