[英]For loop vectorization in Matlab
有沒有一種方法可以矢量化此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個不同的轉換。
一個等效的形式是取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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.