Matlab:通过向量列表对3D数组中的向量进行减法运算

3

我有n组数据,每组包含m个维数为d的向量。这些向量被表示为一个d*m*n的矩阵A。

我有n个维数为d的向量,它们被表示为一个d*n的矩阵B。

现在我想要将所有第i组中的m个向量分别减去其对应的向量B[i](并且对于所有i = 1,...,n都进行这样的操作)。

可以通过简单的方式来实现:

C = zeros(size(A));
for  i = 1:n
    for j = 1:m
        C(:,j,i) = A(:,j,i) - B(:,i);
    end
end

然而,由于循环操作,这个过程会变得非常缓慢。请问有什么非常快速的方法可以解决这个问题吗?
提前感谢您的帮助。
2个回答

6

使用 bsxfun 的完美案例 -

C = bsxfun(@minus,A,permute(B,[1 3 2]))

1
@Nesbit 欢迎!我可以为您推荐一个类似的问题,涉及到多维数组的乘法情况 - https://dev59.com/23_aa4cB1Zd3GeqP9u6g。在那里的解决方案中,您可能会理解为什么/如何使用`permute` - https://dev59.com/23_aa4cB1Zd3GeqP9u6g#23808285。 - Divakar
1
@Nesbit,强调不够! :) 继续提出关于它们的问题!! - Divakar
1
@Nesbit 哈哈哈!! 嗯...我希望声望可以被转移或借出!! :) - Divakar
1
@Nesbit 试一试,可以在这里问我..或者更好的是将问题添加到您的问题中,这样对您和我来说都会更容易 :) 如果是我的专业领域,我可能会做到。 - Divakar
1
@Nesbit 当然,你可以试一下,但我不能保证一定能解决,不过我会尽力! - Divakar
显示剩余16条评论

3

试一试:

B = repmat(reshape(B,[d 1 n]),[1 m 1]);
C = A - B;

编辑

Divakar的解决方案更快。对于d=50;m=75;n=100的100次运行,平均时间如下:

Nesbit的- .0165秒
Divakar的- .0013秒
我的- .0023秒


虽然不如@Divakar的解决方案快,但还是谢谢! - f10w
刚刚测试了一下,看到了 :) - David K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接