【问题标题】:Matlab multiply matrix with matrix along third dimensionMatlab将矩阵与沿第三维的矩阵相乘
【发布时间】:2015-06-24 20:28:05
【问题描述】:

我有一个大小为m x n x 3 的矩阵A,我有一个3x3 矩阵K。现在我想做的是这样的:

for row = 1:m
 for col = 1:n
  A(row,col,:) = K*[A(row,col,1);A(row,col,2);A(row,col,3)];
 end
end

我想要一个没有循环的有效解决方案,因为循环非常慢,因为m x n 通常是图像的大小。

有人有想法吗?

【问题讨论】:

    标签: matlab matrix matrix-multiplication


    【解决方案1】:
    M = 1000;
    N = 1000;
    L = 3;
    A = rand(M,N,L);
    K = rand(L,L);
    Q = reshape((K * reshape( A, [M*N, L] ).' ).', [M, N, L]);
    

    错误检查:

    Z = zeros(M,N,L);
    for mm = 1 : M
      for nn = 1 : N
        Z(mm,nn,:) = K * squeeze( A(mm,nn,:) );
      end
    end
    max( abs( Z(:) - Q(:) ) )
    
    ans =
    
          0
    

    【讨论】:

    • 我绝对喜欢运行时,但是当我运行我的代码和你的代码时,我将两个输出与 isequal(Q,A) 进行比较给我 0,因此两个结果矩阵不一样?!
    • @SemtexB 我添加了一个示例来证明我的代码是正确的。你确定错误不在你的最后吗?你看到多少错误?依靠isequal 处理浮点数并不总是一个好主意。
    • 非常好。我也会这样做。
    • for row = 1:rows for col = 1:cols Cube(row,col,:) = KNew*[Cube(row,col,1);Cube(row,col,2);Cube(row,col,3)]; end end Q = reshape((KNew * reshape( Cube, [rows*cols, 3] ).' ).', [rows, cols, 3]); isequal(Q,Cube) max( abs( Cube(:) - Q(:) ) ) sum(sum((Q-Cube).^2)) 给出输出ans = 0 ans = 46940000 ans(:,:,1) = 2.6636e+20 ans(:,:,2) = 1.0880e+20 ans(:,:,3) = 0
    • @SemtexB 您正在使用Cube 的新值计算Q。在 for 循环之前计算 Q
    猜你喜欢
    • 2011-11-24
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2021-05-25
    • 2016-01-22
    • 2020-06-30
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多