2014-09-13 94 views
1

所以,我試圖優化程序我做了,和兩個明顯的低效我與分析器的幫助下發現的有這些:更有效的替代品,以最大值和最小值

if (min(image_arr(j,i,:)) > 0.1) 
     image_arr(j,i,:) = image_arr(j,i,:) - min(image_arr(j,i,:)); 
    end 
    %"Grounds" the data, making sure the points start close to 0 

叫4990464次,共計58.126秒,佔編譯時間的21.8%。

[max_mag , max_index] = max(image_arr(j, i, :)); 
    %finds the maximum value and its index in the set 

被稱爲4990464次,總共需要50.900s,佔編譯時間的19.1%。

是否有任何替代最大和最小,我可以在這裏使用,這將更有效?
沒有辦法減少這些行被調用的次數。

回答

2

根據呼叫計數,這些可能在一個循環內。矢量化minmax(它們處理矢量向量)。

既然你想找到沿着第三維極值,你可以使用:

image_arr = bsxfun(@minus, image_arr, min(image_arr, [], 3)); 

[max_mag , max_index] = max(image_arr, [], 3); 
+0

充分涵蓋這正是我所需要的!但是,使用第一個時出現錯誤(尚未實現第二個)。 image_arr是[X,Y,N]矩陣,而min(image_arr,[],3)返回[X,Y]矩陣,所以相減會導致錯誤: 使用 - 時出現錯誤矩陣尺寸必須一致。 我們如何改變語法來解決這個問題? – NGXII 2014-09-18 01:02:46

+0

@ user3817992:嘗試'bsxfun(@minus,image_arr,min(image_arr,[],3))' – 2014-09-18 01:09:22

+0

完美地工作!我會在少數情況下最大限度地實施您的建議,並且可能會或可能不會遇到問題,但這絕對是最佳答案。 – NGXII 2014-09-18 02:02:49

0

重命名您的ij

這些名稱對MATLAB有意義,每次看到它們時都要檢查您是否有自己的定義,或者它們的意思是sqrt(-1)

+0

無改善... – NGXII 2014-09-13 01:48:26

+0

@BenVoigt也就是說過去;) – thewaywewalk 2014-09-13 06:40:26

+1

@thewaywewalk:也許性能損失降低,但預定義的'i'的行爲和'j'絕對不是* *過去。 – 2014-09-13 11:24:53

1

這似乎是:

if (min(image_arr(j,i,:)) > 0.1) 
     image_arr(j,i,:) = image_arr(j,i,:) - min(image_arr(j,i,:)); 
    end 

可以這樣被改寫:

data = image_arr(j,i,:); 
mn = min(data); 
if (mn > 0.1) 
    image_arr(j,i,:) = data - mn; 
end 

這似乎是事物的內部循環,可以這樣寫:

minarr = min(image_arr) 
[a,b] = find(minarr > 0.1); 
image_arr(a,b,:) = image_arr(a,b,:) - minarr(a,b) 
+1

'find'在這裏可能比邏輯尋址更差。但是無條件地執行減法可能是最好的。 – 2014-09-13 05:23:36

0

第一部分可以在不使用bsxfun循環來完成。

m = min(image_arr,[],3); 
image_arr = bsxfun(@minus, image_arr, m.*(m>0.1)); 
相關問題