2012-06-27 16 views
8

Próbuję znaleźć tablicę 2d reprezentującą minimalne wartości trzeciego wymiaru w tablicy 3d., Np.Znajdź minimalną niezerową wartość w macierzy

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

Próbowałem za pomocą:

min(a(a>0),3) 

ale to nie jest prawidłowy? Sądzę, że mógłbym uporządkować trzeci wymiar a następnie znaleźć minimum w granicach 1: głębokość-1 - ale to nie wydaje się być najbardziej efektywnym sposobem?

Jakieś myśli?

+0

Zauważ, że jeśli rodzaj minimalna jest drugim (indeks 1 MATLAB jeśli indeksy od 0) elementu, nie musisz znaleźć minimum '1: depth-1' już. Ale tak, to wciąż jest nieskuteczne i musi istnieć lepszy sposób. – IVlad

+0

Powinno być 'min (a, [], 3)', w przeciwnym razie bierzesz mniejsze z 'a' i 3 – Jonas

+0

Dzięki za wskazanie, że wypisujesz Jonas, poprawiłem to teraz. – trican

Odpowiedz

7

Problemem jest to, że a(a>0) zwraca liniowy układ, więc będziesz skończyć z jednym minimum, jak przeciwieństwo do tablicy 2D z minimami.

Najbezpieczniejszym sposobem pobrania minimalnej wartości niezerowej jest zamaskowanie ich za pomocą Inf, tak aby zera nie kolidowały z obliczaniem minimum.

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

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

To, niestety, powoduje wypalanie dla rzadkich macierzy, ponieważ przypisanie wartości do zer w macierzy rzadkiej (dużej) może być bardzo kosztowne. Zdaję sobie sprawę, że to nie było pytanie PO - ale tylko FYI. –

3

Jedną z możliwości byłoby po prostu wykonanie wszystkich zerowych wartości bardzo dużych.

Na przykład, jeśli wiesz, że żadne elementy nigdy być większa niż 1000 można użyć

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

użyj inf zamiast 1000 – Dan

0

prostu przypisanie tych punktów nieskończoności, gdy wartość wynosi zero, więc zawsze min odpowiedź nie będzie Graf Zero te ..... jak a (a == 0) = inf; % następnie policz min min minelement = min (a);

0

usunąć zerowe elementy z matrycy tak:

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