用于Matlab中的循环向量化

时间:2016-11-01 02:48:56

标签: matlab vectorization

有没有办法可以对这个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个不同的变换。

1 个答案:

答案 0 :(得分:0)

一个等效形式是取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);