首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用bsxfun时需要帮助

在使用bsxfun时需要帮助
EN

Stack Overflow用户
提问于 2014-05-31 20:08:00
回答 1查看 124关注 0票数 3

我在MATLAB中有两个数组:

代码语言:javascript
复制
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

代码语言:javascript
复制
m; % size(m) = [3 3]
n; % size(n) = [3 1]

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

代码语言:javascript
复制
solution = bsxfun( @(A,b) A\b, A, b );

我认为问题在于单例元素的扩展,我不知道如何修复它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-03 16:03:14

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

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

代码语言:javascript
复制
%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

压缩在计算时间上是昂贵的,因为它需要一些高级索引。相反,交换尺寸的速度更快。

代码语言:javascript
复制
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并启动工作人员。

代码语言:javascript
复制
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]);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23974202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档