我想用循环来计算400个50X50矩阵的协方差,所以当我尝试的时候..
for i=t-9:t+59
for j=r-9:r+59
a(:,:,p)=vidFrames2(i:(i+49),j:(j+49));
b(:,:,p)=cov3d(double(a));
p=p+1;
end
end
这段代码我得到了错误“赋值具有比非单例下标更多的非单例rhs维度”,但是当我想要在这段代码中通过挤压函数来消除这个错误时,
b(p,:)=cov3d(squeeze(double(a)));
我得到“下标赋值维度不匹配”。如何计算3d matrix....the cov3d
函数的协方差是-
function xy = cov3d(x)
[m,n,r] = size(x);
if m==1
x=zeros(n,n,r,class(x));
else
xc=bsxfun(@minus,x,sum(x,1)/m);
for i=1:r
xci=xc(:,:,i);
xy(:,:,i)=xci'*xci;
end
xy=xy/(m-1);
最后,实际上我想要400个协方差矩阵存储在一个variable.after中,这个改变我只得到了一个协方差matrix.actually,我在一个帧上工作,在这个帧中,我存储了一个50×50矩阵的i和j的初始坐标值。然后,我想以50X50矩阵的形式获得10X10邻域的像素值。这意味着如果我输入的初始坐标为(100,100),那么我希望获得存储在区域(91,91)(91,141)(141,91)(141,141)中的像素值,.then存储这个矩阵的协方差值。然后,它将再次找到区域(92,91)、(142,91)(92,141)、(142,141)等的像素值,并覆盖整个area..so。如果我覆盖整个区域,我想我将得到总计400 matrices.and我想要存储所有区域的协方差值。今天,我将for循环的上限改为i=t-9:t+60和j=r-9:r+60,但我没有得到400个协方差矩阵
发布于 2015-02-04 00:00:57
以下是关于您的代码的一些注释:
cov3d
旨在返回3D矩阵,其中输入也是计算此3D矩阵中每个切片的协方差的3D矩阵。在您的代码中,外部for
循环(索引i
和j
)从t-9
转到t+59
,每个变量的步长为1。因此,这对循环将执行((t+59) - (t-9) + 1)^2 = 69^2 = 4761
时间。我假设在每次迭代中,你都在提取一个位于a
的2D矩阵,这就是为什么你最初说了400次。您基本上想提取400个矩阵,但实际上提取的是4761个矩阵。确保正确声明a
,以说明如此多的元素。a(:,:,p)=vidFrames2(i:(i+49),j:(j+49));
访问one a
.,而正在访问 slice的整个3D矩阵因此,您将获得一个3D矩阵作为cov3d
的输出,但是您正在尝试将其分配给b
中的单个切片。您可能应该做的是先创建a
矩阵,然后在完成后调用one调用cov3d
。因此,尝试将您的代码更改为:
%// Create `a` matrix first
for i=t-9:t+59
for j=r-9:r+59
a(:,:,p)=vidFrames2(i:(i+49),j:(j+49));
p=p+1;
end
end
%// Now call cov3d
b = cov3d(double(a));
希望这将以您希望的方式工作,您的代码将最初工作。
https://stackoverflow.com/questions/28299732
复制相似问题