如何提高 matlab 計算速度 運算效率
阿新 • • 發佈:2019-01-03
最近在網上查了一些資料,並結合自己的經驗,就如何提高matlab計算效率,總結一下幾個原則:
1. 提前給陣列分配大小。
例如:在程式迴圈時用到陣列變數 a ,若知道陣列 a 的大小或者知道 a 的大小上界,則可以提前給陣列a 分配大小。 一般MATLAB也會給沒有提前
分配大小的變數陣列下面標示紅線,提醒修改。
a=zeros(10,10)
生成一個10行10列的零矩陣。
a=100*ones(10,10)
生成一個10行10列的矩陣,並且每個元素都是100。
a=(1:10)
生成一個從1到10的1行10列矩陣。
2. 儘量用向量計算,減少 for 迴圈。
最近我也才意識到這一點,matlab自帶的很多函式都支援向量計算。直接向量計算,避免大量的for迴圈。
用 min 函式舉例:
clc
a=(1:1000000);
tic
for i=1:1000000
a(i)=min(a(i),100);
end
toc
tic
b=max(a,100);
toc
結果顯示:
時間已過 0.028604 秒。
時間已過 0.006296 秒。
可見後者比前者的 for 迴圈快。
3. 儘量呼叫 maltab自帶的函式來實現一些功能。
這個是顯而易見的,matlab自帶的函式由大神級的matlab開發人員所編寫,他們當然會在計算速度上做不少優化,一定比我們編寫的好。
4. 少用 find 函式,用 logical 替代。
查詢替換矩陣中的元素,過去用 find 函式,現在用 logical 更好。
下面用一個例子,分別測試 for 迴圈,find函式,logical函式查詢替換:
a=(1:10000000);
tic
for i=1:length(a)
if a(i)>5
a(i)=1;
end
end
toc
tic
a(find(a)>5)=1;
toc
tic
a(logical(a)>5)=1;
toc
結果顯示:
時間已過 0.407840 秒。
時間已過 0.378585 秒。
時間已過 0.119918 秒
可見,find 函式僅僅比 for 迴圈快一點,而 logical 函式則顯著快於它們。
5. 必須用到矩陣拼接,可變矩陣時,用 end 拼接矩陣。
例如:
function test
A=cell(3,1);
tic
N=10000;
for t=1:3
a=magic(3);
for i=1:N
a=[a;magic(3)];
end
A{t}=a;
end
toc
B=cell(3,1);
tic
for t=1:3
B{t}(end+1:end+3,:)=magic(3);
end
toc
end
時間已過 1.723104 秒。時間已過 0.001621 秒。
6. 大規模的迴圈,可以呼叫 c語言或 C++來 計算。
這個見不少資料說,自己還沒試過,有機會測試一下。