我有一個非常大的Matlab仿真項目,我想優化它,因爲我多次運行它來調整參數等。在大型仿真中改善Matlab功能
使用Matlab的profile
我認定一個功能是吃了我大部分的時間,特別是output(i,1)= max(mean(dens(i+1:a,1)),dens(i+1,1));
該功能被稱爲LOT線,其中input
是10x1
雙作爲參數傳遞,並output
也是一個10x1
載體。
function output = my_function(input)
a = size(input,1);
output = input*0;
dens = density(input);
% for each i, output(i) is the maximum between output(i+1) and mean(output(i+1:end))
for i = 1:a-1
output(i,1)= max(mean(dens(i+1:a,1)),dens(i+1,1));
end
output(a,1) = dens(a,1);
end
我的想法:
- 我覺得矢量將可能有助於擺脫循環的,但我不熟悉所有與技術(?)。
- 是否有計算
mean
更快/替代方式(也許沒有Matlab的內置函數調用?)
編輯 我試圖向量化的功能,我得到了以下替換結果,其執行相同的操作:
function output = my_function_vectorized(input)
a = size(input,1);
rho_ref = zeros(size(input));
dens = density(input);
temp_cumsum = flip(cumsum(flip(dens))./(1:1:a)');
output = [max(temp_cumsum(2:end),dens(2:a));dens(a)];
end
我試圖測試二者功能通過以下方式:
Ts = random('unif',40,80,10,1000);
Results_original = zeros(size(Ts));
Results_vectorized = zeros(size(Ts));
TIMES_original = zeros(size(Ts,2),1);
TIMES_vectorized = zeros(size(Ts,2),1);
for ii = 1:size(Ts,2)
tic;
Results_original(:,ii) = my_function(Ts(:,ii));
TIMES_original(ii) = toc;
end
for ii = 1:size(Ts,2)
tic;
Results_vectorized(:,ii) = my_function_vectorized(Ts(:,ii));
TIMES_vectorized(ii) = toc;
end
res = norm(Res_1 - Res_2);
mTIMES_original = mean(TIMES_original);
mTIMES_vectorized = mean(TIMES_vectorized);
因我所得到:
res =
3.1815e-12
mTIMES_original/mTIMEZ_vectorized =
3.0279
- 如果這種殘留被涉及到我?
- 說我把這個計算結果固定爲3是否正確?
謝謝,你能解釋一下你用最後一個'max'做什麼嗎? 我正在檢查,如果這可能在我的實施工作。另外,好的最後一段:) – 2014-12-05 19:15:38
好吧,所以你的矢量化方法,**但**功能'cumsum'有一個主要問題。它將所有值顯示爲具有指數的向量:'1.0e + 03 *'整個向量。總而言之,我已經比較了手動爲每個「k」執行'sum(dens(k:a))'的值,它們是不同的。在這種情況下如何使'cumsum'正確工作? – 2014-12-06 11:05:12
我在家使用「R」。答案將等到星期一,我再次訪問許可證付費的MatLab。 (可能在午餐時間) – EngrStudent 2014-12-06 22:10:31