在Matlab中创建和操作三维矩阵

Pen*_*One 6 matlab matrix-multiplication bsxfun

我拼命想避免for在Matlab中使用循环,但我无法弄清楚如何做到这一点.情况如下:

我有两个m x n矩阵AB两个向量vw长度d.我想要外部乘法A,v以便我得到一个m x n x d矩阵,其中的(i,j,k)条目是A_(i,j) * v_k,并且类似于Bw.

之后,我想添加生成的m x n x d矩阵,然后mean沿最后一个维度返回m x n矩阵.

我很确定我可以处理后一部分,但第一部分让我完全卡住了.我尝试使用bsxfun无济于事.有人知道这样做的有效方法吗?非常感谢!

编辑:此修订发布在以下三个伟大的答案之后.毫无疑问,gnovice对我提出的问题有最好的答案.但是,我打算提出的问题涉及在取平均值之前对每个条目进行平方.我最初忘了提这个部分.鉴于这种烦恼,其他两个答案都运作良好,但在编码之前进行代数的聪明伎俩并没有帮助.感谢大家的帮助!

gno*_*ice 7

编辑:

即使问题中的问题已经更新,仍然可以使用代数方法来简化问题.您仍然不必费心使用3-D矩阵.你的结果就是这样:

output = mean(v.^2).*A.^2 + 2.*mean(v.*w).*A.*B + mean(w.^2).*B.^2;
Run Code Online (Sandbox Code Playgroud)

如果您的矩阵和向量很大,与使用BSXFUNREPMAT的解决方案相比,由于减少了所需的内存量,此解决方案将为您提供更好的性能.


说明:

假设M是在沿第三维度取平均值之前得到的m-by-by-by-d矩阵,这就是沿第三维度的跨度将包含的:

M(i,j,:) = A(i,j).*v + B(i,j).*w;
Run Code Online (Sandbox Code Playgroud)

换句话说,矢量v按比例缩放A(i,j)加上矢量w缩放B(i,j).这就是你应用元素方形时得到的结果:

M(i,j,:).^2 = (A(i,j).*v + B(i,j).*w).^2;
            = (A(i,j).*v).^2 + ...
              2.*A(i,j).*B(i,j).*v.*w + ...
              (B(i,j).*w).^2;
Run Code Online (Sandbox Code Playgroud)

现在,当您在第三维度上取平均值时,每个元素的结果output(i,j)将如下所示:

output(i,j) = mean(M(i,j,:).^2);
            = mean((A(i,j).*v).^2 + ...
                   2.*A(i,j).*B(i,j).*v.*w + ...
                   (B(i,j).*w).^2);
            = sum((A(i,j).*v).^2 + ...
                  2.*A(i,j).*B(i,j).*v.*w + ...
                  (B(i,j).*w).^2)/d;
            = sum((A(i,j).*v).^2)/d + ...
              sum(2.*A(i,j).*B(i,j).*v.*w)/d + ...
              sum((B(i,j).*w).^2)/d;
            = A(i,j).^2.*mean(v.^2) + ...
              2.*A(i,j).*B(i,j).*mean(v.*w) + ...
              B(i,j).^2.*mean(w.^2);
Run Code Online (Sandbox Code Playgroud)

  • @gnovice嗯.你是对的.由于A和B基本上都是作为标量参与,所以你的断言只是考虑"sum"而不是"mean".要删除我的答案.最好以代数方式做到这一点. (2认同)