Matlab 在矩阵中存储来自循环的输出时出现错误消息

Matlab 在矩阵中存储来自循环的输出时出现错误消息,matlab,loops,for-loop,matrix,storing-data,Matlab,Loops,For Loop,Matrix,Storing Data,我有一个程序,可以计算样本中每天实现的协方差,但在将输出存储到矩阵中时遇到了一些问题 计划如下: 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 -

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

计划如下:

 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
下标赋值维度不匹配

我尝试了各种方法将输出存储在矩阵中,比如在零上定义一个矩阵来存储输出,或者让存储矩阵的行维度不被定义,但似乎没有任何效果


如果你能给我一个如何应对这一挑战的建议,我将不胜感激

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

如图所示,您可以非常轻松地使用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
,最后一个索引是迭代次数。因此,要访问迭代的输出,您需要执行
mat(:,:,1032)
,可能需要一个环绕,使其成为2D而不是3D。

实际上
mat(24142)
是矩阵中的一个位置,您不能在其中分配四个值。 每次要为其赋值时,都需要在
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

我已经使用了一种解决方案来完成这项工作

我定义了一个矩阵,然后使用以下方法一次填写所有输出:

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

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

您可以删除旧问题。
已实现的\u协方差
不是本机的MATLAB函数。请分享该函数的代码,以便我们可以尝试帮助您。大家好,我不知道以前有人问过这个问题?因为我找的时候它没有弹出。阿德里安:我可以很容易地发布实现协方差计算的代码,但它不在这里,我有问题。如果我只是运行程序,而不想将输出存储在矩阵中,它就会运行perfectly@KristianNielsen:堆栈溢出上的MATLAB标记中有。我深表歉意,我应该考虑搜索错误消息,我很快就发布了我的问题。我有点不确定如何正确地实现这一点,或者更准确地说,我不确定如何使矩阵随着循环产生输出而增长。感谢您的回复。对于我来说,使用以下矩阵是非常自然的;mat(:,1:2),因为据我所知,这是一个nx2矩阵,然后分配其中的每个输出。但它似乎并不正确。@ KrasTiNeNel森可能会考虑一个<代码> 2×2×N < /COD>矩阵,例如<代码> Mat=0(2,2207)< /代码>,如果<代码> VEC < /代码>是代码> 2-By2,可以将其存储为<代码> Mat(:,,,Day-No.1)=VEC < /代码>。嘿,史提夫,那么我必须定义DayIn号正确吗?f、 x.day_number=1,然后将其包含在我的循环中?以:mat(:,:,day_number)=vec结束,以:day_number=day_number+1结束,还是我错了?@adrian
ii
不是索引
mat
第三维的好计数器,因为它不是连续的。嗨,再见,谢谢你的回答,不幸的是,我仍然收到相同的错误消息。“已实现的_协方差函数生成一个2x2矩阵,我需要得到一个4142x2矩阵,其中包含循环期间生成的所有输出。@克里斯蒂安·尼尔森你说得对,我编辑了它。希望它现在能起作用!这也是一个解决办法。这对你很好,因为你自己找到了它!请注意,一个好的做法是在循环之前预先分配矩阵(如@Adriaan’s and mine answers),因为在每次迭代中增加矩阵会耗费时间和内存。谢谢你让我知道Adiel。实际上我试过了,但是当我这么做的时候,我的输出被加载到了最后定义的行中。e、 g我从定义A为A=0(2071,2)开始,然后与上面一样,但最后我的输出从2071行开始。我在哪里搞砸了?问题是你把
A
原封不动地拿出来,再加上另一个数据。所以它取所有的零,然后加上
vec
。在我的回答中,我准确地定义了数据应该在矩阵中的位置。