【问题标题】:For loop vectorization in MatlabMatlab中的循环向量化
【发布时间】:2016-11-01 02:48:55
【问题描述】:

有没有一种方法可以将这个 for 循环向量化,并在 MATLAB 中使其更快地处理大 n?

for j=1:n
  % find point coordinate in a different basis
  pt_2(:,:,j) = Mat(:,:,t(j)) * pt_1(:,:,j);
end

其中pt_1pt_23x1xn 数组,Mat3x3xm 数组,tnx1 向量。循环想要得到从另一个线性空间的n个坐标变换而来的n个点坐标,有m个不同的变换。

【问题讨论】:

  • 您能否提供输入示例,以便我们执行此代码。不能运行代码很难检查。
  • 这些值来自一些先前的计算,但也许你可以使用一些任意值:例如n=200000;米=20; pt_1=ones(3,1,n);垫=个(3,3,米); pt_2=零(3,1,n);只是为了测试循环执行时间。
  • 谢谢。但是 t 仍然丢失。
  • 哦,对不起,也许 t=ones(n,1)。听起来很傻,但只要它每次都在访问值。 t是从[1,n]到[1,m]的映射,它决定了从1到n的每个数属于m个类别中的哪一个。

标签: matlab vectorization


【解决方案1】:

等价的形式是取pt_1(:,:,j),转置并重复3次,形成一个3 * 3的矩阵,所以我们有:

pt_1_j = [pt_1(:,:,j).' ; pt_1(:,:,j).' ; pt_1(:,:,j).'];

然后我们可以将 Mat(:,:,t(j)) 乘以 pt_1_j 元素

M = Mat(:,:,t(j)) .* pt_1_j;

然后将M 沿其第二维求和

pt_2(:,:,j) = sum(M,2);

bsxfun也可以做同样的事情

M = bsxfun(@times , Mat(:,:,t(j)) , pt_1(:,:,j).');
pt_2(:,:,j) = sum(M,2)

pt_2(:,:,j) = sum(bsxfun(@times , Mat(:,:,t(j)) , pt_1(:,:,j).'),2)

将上述方法推广到3维:

Mat 是为所有迭代预先计算的,因此使用 Mat(:,:,t) 代替 M(:,:,t(j))permute 用于转置 3D 数据。

然后申请sum(bsxfun...

pt_2 = sum(bsxfun(@times, Mat(:,:,t), permute(pt_1,[2 1 3])), 2);

【讨论】:

    猜你喜欢
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2013-02-18
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多