如何解决在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,:).^2 = (A(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,:).^2);
= mean((A(i,j).*v).^2 + ...
2.*A(i,j).*v.*w + ...
(B(i,j).*w).^2);
= sum((A(i,j).*v).^2 + ...
2.*A(i,j).*v.*w + ...
(B(i,j).*w).^2)/d;
= sum((A(i,j).*v).^2)/d + ...
sum(2.*A(i,j).*v.*w)/d + ...
sum((B(i,j).*w).^2)/d;
= A(i,j).^2.*mean(v.^2) + ...
2.*A(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,[])) ...
+ bsxfun(@times,B,reshape(w,[])),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,[]))).^2,3);
isequal(output,outputLG)
ans =
1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。