在Matlab中创建和处理三维矩阵

|| 我极力尝试在Matlab中避免
for
循环,但是我不知道该怎么做。情况如下: 我有两个
m x n
矩阵
A
B
,以及两个向量two4 vector和
w
,长度length6ѭ。我想对
A
v
进行外部乘积,以便得到一个
m x n x d
矩阵,其中ѭ10is条目为
A_(i,j) * v_k
,类似地对于
B
w
。 之后,我想添加结果
m x n x d
矩阵,然后沿最后一个维度取
mean
来获得
m x n
矩阵。 我很确定我可以处理后一部分,但是第一部分使我完​​全陷入困境。我试着用
bsxfun
无济于事。有人知道这样做的有效方法吗?非常感谢! 编辑:此修订版是在以下三个重要答案之后提出的。毫无疑问,gnovice对我提出的问题有最佳答案。但是,我要问的问题是在取均值之前对每个项求平方。我最初忘记提及这部分。考虑到这种烦恼,其他两个答案都可以很好地工作,但是这次在编码之前做代数的聪明技巧并没有帮助。谢谢大家的帮助!     
已邀请:
        编辑: 即使问题中的问题已更新,代数方法仍然可以用来简化问题。您仍然不必担心3D矩阵。您的结果将是这样的:
output = mean(v.^2).*A.^2 + 2.*mean(v.*w).*A.*B + mean(w.^2).*B.^2;
如果矩阵和向量很大,则与使用BSXFUN或REPMAT的解决方案相比,由于所需的内存减少,因此该解决方案将为您提供更好的性能。 说明: 假设
M
是在沿第三维测量均值之前得到的m×n×d矩阵,则沿三维的跨度将包含以下内容:
M(i,j,:) = A(i,j).*v + B(i,j).*w;
换句话说,向量
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;
现在,当您对第三个维度取平均值时,每个元素
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);
    
        尝试将向量
v
w
重塑为
1 x 1 x d
  mean (bsxfun(@times, A, reshape(v, 1, 1, [])) ...
        + bsxfun(@times, B, reshape(w, 1, 1, [])), 3)
在这里,我在
reshape
的参数中使用
[]
来告诉它根据所有其他维数与向量中元素总数的乘积来填充该维数。     
        使用
repmat
将矩阵平铺在第三维中。
A =

     1     2     3
     4     5     6

>> repmat(A, [1 1  10])

ans(:,:,1) =

     1     2     3
     4     5     6


ans(:,:,2) =

     1     2     3
     4     5     6
等等     
        您仍然不必借助
bsxfun
等人求助于任何显式循环或间接循环。您更新的要求。您可以通过以下简单的矢量化解决方案来实现所需的目标
output = reshape(mean((v(:)*A(:)\'+w(:)*B(:)\').^2),size(A));
由于OP仅表示
v
w
是长度为
d
的向量,因此上述解决方案应适用于行向量和列向量。如果已知它们是列向量,则可以将
v(:)
替换为
v
,并同样替换
w
。 您可以按照以下步骤检查它是否与Lambdageek的答案相符(修改为使术语平方)
outputLG = mean ((bsxfun(@times, A, reshape(v, 1, 1, [])) ...
        + bsxfun(@times, B, reshape(w, 1, 1, []))).^2, 3);

isequal(output,outputLG)

ans =

     1
    

要回复问题请先登录注册