簡體   English   中英

在Matlab中進行循環矢量化

[英]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_1pt_23x1xn數組, Mat3x3xm數組, tnx1向量。 循環想要從另一個線性空間的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM