matlab的40050x50矩阵的协方差

matlab的40050x50矩阵的协方差,matlab,matrix,Matlab,Matrix,我想用loop来计算40050x50矩阵的协方差,所以当我尝试时 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(

我想用loop来计算40050x50矩阵的协方差,所以当我尝试时

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矩阵的协方差…
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个协方差矩阵。在这个更改之后,我只得到一个协方差矩阵。实际上,我正在一个框架上工作,在这个框架中,我将50 X 50矩阵的初始坐标值存储在i和j中。然后我想得到50x50矩阵形式的10x10邻域的像素值。这意味着,如果我输入初始坐标为(100100),那么我想获得存储在区域(91,91)(91141)(141,91)(141141)内的像素值。然后存储此矩阵的协方差值。然后它会再次找到区域(92,91),(142,91)(92141),(142141)等的像素值,并覆盖整个区域。因此,如果我覆盖整个区域,我想我将得到总共400个矩阵。我想存储所有区域的协方差值,。。今天,我将for循环的上限改为i=t-9:t+60和j=r-9:r+60,但我没有得到400个协方差矩阵

关于代码的一些评论:

  • cov3d
    设计用于返回3D矩阵,其中输入也是一个3D矩阵,用于计算该3D矩阵中每个切片的协方差。从您的代码中,循环(索引
    i
    j
    )的外部
    t-9
    t+59
    ,每个变量的步骤为1。因此,这对循环将执行
    ((t+59)-(t-9)+1)^2=69^2=4761次。我假设在每次迭代中,你都在提取一个位于
    a
    的2D矩阵,这就是你最初说400次的原因。基本上你想提取400个矩阵,但实际上你提取了4761个矩阵。确保正确声明了
    a
    ,以说明这么多元素

  • a(:,:,p)=视频帧2(i:(i+49),j:(j+49))访问一个切片,但是
    b(:,:,p)=cov3d(双(a))
    正在访问整个
    a
    的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));
    

    希望这能像您最初希望的那样工作。

    我看到这些50乘50的矩阵似乎是视频中的帧。你的目标是根据像素强度的分布为视频中的每一帧找到一个2x2的协方差矩阵吗?@eigenchris-OP从这里提取了
    cov3d
    代码:@rayryeng啊,我明白了。谢谢。:)