2012-06-27 225 views
8

我試圖找到一個代表三維數組中第三維最小值的二維數組。查找矩陣中的最小非零值

a = floor(rand(10,10,3).*100); % representative structure 
b = min(a,[],3); % this finds the minimum but also includes 0 

我試着使用:

min(a(a>0),3) 

但這是不正確的?我想我可以對a的第三維進行排序,然後在1:depth-1內找到最小值 - 但這似乎並不是最有效的方法?

有什麼想法?

+0

請注意,如果您排序,最小的是第二個(索引1,如果從0 MATLAB索引)元素,你沒有找到最低的'1:深度1'了。但是,是的,這仍然是低效率的,必須有更好的方法。 – IVlad

+0

它應該是'min(a,[],3)',否則你把小'a'和3 – Jonas

+0

謝謝你指出那個錯誤的Jonas,我現在糾正它。 – trican

回答

7

的問題是,a(a>0)返回的線性陣列,所以你會用一個最小的結束,如與具有最小值的二維數組相反。

獲取最小非零值的最安全方法是用Inf來掩蓋它們,以便零點不會干擾最小值的計算。

tmp = a; 
tmp(tmp==0) = Inf; 

b = min(tmp,[],3); 
+0

這不幸地爲稀疏矩陣回火,因爲將值分配給(大)稀疏矩陣中的所有零可能是非常昂貴的。我意識到這不是OP的問題,而只是一個供參考。 –

3

一種可能性是簡單地使所有的零值非常大。

例如,如果您知道任何元素,將永遠是大於1000,您可以使用

b = min(a+1000*(a==0),[],3) 
+1

使用inf而不是1000 – Dan

0

簡單地分配這些點無窮大,其中的值是零,因此總是分鐘答案不會計數零對那些.....像 A(A == 0)= INF; %然後計算最小值 minelement = min(a);

0

刪除矩陣零個元素是這樣的:

a = [10 2 0 4 5; 156 1.7 45 23 0 ]; 
    a(a == 0) = NaN;% not a number 
    min(a(:)) 
    >> ans = 1.7