有没有办法可以对这个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_1
,pt_2
是3x1xn
数组,Mat
是3x3xm
数组,t
是nx1
向量。循环想要获得从另一个线性空间的n个坐标转换的n个点坐标,并且存在m个不同的变换。
答案 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);