gpt4 book ai didi

matlab - 在使用 bsxfun 方面需要帮助

转载 作者:太空宇宙 更新时间:2023-11-03 20:35:05 25 4
gpt4 key购买 nike

我在 MATLAB 中有两个数组:

A; % size(A) = [NX NY NZ 3 3]
b; % size(b) = [NX NY NZ 3 1]

事实上,在三维域中,我为每个 (i, j, k) 定义了两个数组,它们是从上述数组 Ab,它们的大小分别是[3 3][3 1]。为了举例,我们将这些数组称为 mn

m; % size(m) = [3 3]
n; % size(n) = [3 1]

如何以矢量化方式为域的每个点求解 m\n?我使用了 bsxfun 但我没有成功。

solution = bsxfun( @(A,b) A\b, A, b );

我认为问题出在单例元素的扩展上,我不知道如何解决。

最佳答案

我尝试了一些解决方案,在这种情况下,for 循环似乎实际上是最快的可能性。

一个天真的方法是这样的:

%iterate
C=zeros(size(B));
for a=1:size(A,1)
for b=1:size(A,2)
for c=1:size(A,3)
C(a,b,c,:)=squeeze(A(a,b,c,:,:))\squeeze(B(a,b,c,:));
end
end
end

挤压在计算时间上很昂贵,因为它需要一些高级索引。相反,交换维度更快。

A=permute(A,[4,5,1,2,3]);
B=permute(B,[4,1,2,3]);
C2=zeros(size(B));
for a=1:size(A,3)
for b=1:size(A,4)
for c=1:size(A,5)
C2(:,a,b,c)=(A(:,:,a,b,c))\(B(:,a,b,c));
end
end
end
C2=permute(C2,[2,3,4,1]);

第二个解决方案大约快 5 倍。

/更新:我找到了一个改进的版本。 reshape 并仅使用一个大循环再次提高速度。这个版本也适合与并行计算工具箱一起使用,如果你拥有它,用 parfor 替换 for 并启动 workers。

A=permute(A,[4,5,1,2,3]);
B=permute(B,[4,1,2,3]);
%linearize A and B to get a better performance
linA=reshape(A,[size(A,1),size(A,2),size(A,3)*size(A,4)*size(A,5)]);
linB=reshape(B,[size(B,1),size(B,2)*size(B,3)*size(B,4)]);
C3=zeros(size(linB));
for a=1:size(linA,3)
C3(:,a)=(linA(:,:,a))\(linB(:,a));
end
%undo linearization
C3=reshape(C3,size(B));
%undo dimension swap
C3=permute(C3,[2,3,4,1]);

关于matlab - 在使用 bsxfun 方面需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23974202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com