簡體   English   中英

矢量化或替代以加快 MATLAB 循環

[英]Vectorization or alternative to speed up MATLAB loop

我正在使用 MATLAB 運行一個 for 循環,其中在每次迭代時使用另一個向量的內容更新大向量的可變長度部分; 就像是:

for k=1:N
   vec1(idx_start1(k):idx_end1(k)) = vec1(idx_start1(k):idx_end1(k)) +...
        a(k)*vec2(idx_start2(k):idx_end2(k));
end

vec1vec2的選定部分不是那么小, N可以很大; 此外,如果這可能有用, idx_end(k)<idx_start(k+1)不一定成立(即vec1的編輯部分可能會在后續迭代中部分重新更新)。 因此,以上是我的腳本中迄今為止最慢的代碼部分,如果可能的話,我想加快它的速度。

有什么方法可以對上述 for 循環進行矢量化以使其運行得更快? 或者,是否有任何替代方法可以提高其執行速度?

編輯:

根據評論中的要求,這里有一些示例值:使用分析器檢查執行時間,上面的循環運行大約 3.3 秒,其中N=5e4length(vec1)=3e6length(vec2)=1.7e3和部分由idx_start/end索引的平均時間略短於后者,但並不顯着。

當然,3.3 s 本身並不是特別令人擔憂,但我希望能夠將Nvec1增加 1 或 2 個數量級,並且在這樣的循環中運行需要相當長的時間。

抱歉,我找不到加快代碼速度的方法。 這是我為加快速度而創建的代碼:

N = 5e4;
vec1 = 1:3e6;
vec2 = 1:1.7e3;
rng(0)
a = randn(N, 1);
idx_start1 = randi([1, 2.9e6], N, 1);
idx_end1 = idx_start1 + 1000;
idx_start2 = randi([1, 0.6e3], N, 1);
idx_end2 = idx_start2 + 1000;
for k=1:N
   vec1(idx_start1(k):idx_end1(k)) = vec1(idx_start1(k):idx_end1(k)) + a(k) * vec2(idx_start2(k):idx_end2(k));
%    use = idx_start1(k):idx_end1(k);
%    vec1(use) = vec1(use) + a(k) * vec2(idx_start2(k):idx_end2(k));
end

for 循環中被注釋掉的兩行代碼是我試圖加快它的速度,但它實際上使它變慢了,令我驚訝的是。 一般來說,我會為一個多次使用的數組創建一個變量,認為它更快,但事實並非如此。 未注釋掉的代碼運行時間為 0.24 秒,而注釋掉的代碼運行時間為 0.67 秒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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