1. 程式人生 > >如何提高 matlab 計算速度 運算效率

如何提高 matlab 計算速度 運算效率

最近在網上查了一些資料,並結合自己的經驗,就如何提高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++來 計算。

這個見不少資料說,自己還沒試過,有機會測試一下。