所以我不得不在 Matlab 中撰寫一個程式來手動計算兩個函式的卷積。我寫了這段簡單的代碼,我知道它可能沒有優化:
syms recP(x);
recP(x) = rectangularPulse(-1,1,x);
syms triP(x);
triP(x) = triangularPulse(-1,1,x);
t = -10:0.1:10;
s1 = -10:0.1:10;
for i = 1:201
s1(i) = 0;
for j = t
s1(i) = s1(i) ( recP(j) * triP(t(i)-j) );
end
end
plot(t,s1);
我有一個核心 i7-7700HQ 加上 32 GB 的 RAM。Matlab 存盤在我的 HDD 上,而我的 Windows 存盤在我的 SSD 上。問題是我認為這個簡單的代碼至少需要 20 分鐘才能運行。我把它放在一個部分,我沒有運行整個代碼。在這個任務中,Matlab 只占用了我 18% 的 CPU 和 3 GB 的 RAM。我認為這可能足夠了,我不知道。但我認為不需要那么長時間。
我做錯了什么嗎?我搜索了如何增加Matlab的RAM限制,我發現它不受限制,需要多少。我不知道我是否可以增加它的CPU使用率。
有沒有辦法讓事情變得更快一點?我的作業中有 6 或 7 個這樣的 for 回圈,如果我運行整個實時腳本,它會花費很長時間。
(另外,它突出顯示了當前正在運行的那段代碼。它是for回圈,外面的那個被突出顯示)
uj5u.com熱心網友回復:
就像安德說的,最后的手段是使用 matlab 中的符號工具箱。此外,在嘗試加速 matlab 代碼時,請重點利用 matlab 的矢量化操作。我的意思是 matlab 在執行這樣的操作時非常有效:
y = x.*z;
其中 x 和 z 分別是一些 Nx1 向量,運算子“.*”稱為“點乘法”。這實質上是告訴 matlab 對 x 1 *z 1 , x[2]*z[2] .... x[n]*z[n]執行乘法并將所有值分配給向量 y 中的相應值. 此外,matlab 中的許多函式都能夠接受向量作為輸入并對每個元素執行它們的操作,并在每個元素上回傳一個大小相等的向量和輸出。您可以通過在其檔案中向下滾動到輸入和輸出部分并檢查輸入和輸出可以采用的陣列形式來檢查任何給定函式的這一點。例如,rectanglePulse的檔案說它可以接受向量作為輸入。所以,
s1(i) = s1(i) ( rectangularPulse(-1,1,t) * triP(t(i)-t) );
所以總結一下:
- 避免使用 matlab 中的符號工具箱,直到您對自己正在做的事情有了更好的掌握,或者您絕對必須使用它。
- 利用matlab的能力可以很好地處理向量和陣列。
- 從內到外解構您一次撰寫一個的任何嵌套回圈。通常這會極大地加速 matlab 代碼,尤其是當您不熟悉撰寫它時。
看看您是否可以進一步簡化代碼并擺脫外部回圈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360894.html
