我在MATLAB中有两个数组:
A; % size(A) = [NX NY NZ 3 3]
b; % size(b) = [NX NY NZ 3 1]实际上,在三维域上,我为每个(i, j, k)定义了两个数组,分别是从上述数组A和b中得到的,它们的大小分别是[3 3]和[3 1]。为了示例起见,让我们将这些数组称为m和n。
m; % size(m) = [3 3]
n; % size(n) = [3 1]如何以矢量化的方式求解域的每个点的m\n?我使用了bsxfun,但我没有成功。
solution = bsxfun( @(A,b) A\b, A, b );我认为问题在于单例元素的扩展,我不知道如何修复它。
发布于 2014-06-03 16:03:14
我尝试了一些解决方案,似乎在这种情况下,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倍。
/Update:我找到了一个改进的版本。整形和使用一个大循环再次提高了速度。此版本也适合与并行计算工具箱一起使用,以防您拥有它,用parfor替换for并启动工作人员。
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]);https://stackoverflow.com/questions/23974202
复制相似问题