2011-02-22 13 views
17

Bir 2D dizi sayısının minimum değerinin yerini bulan MATLAB içerisinde bir komut dosyası yazmaya çalışıyorum. Bu dizide sadece 1 minimum olduğundan eminim, bu nedenle dizide aynı minimum değere sahip birden fazla konuma sahip olmak bir sorun değildir. Ben dizinin en az değerini bulabilirsiniz, ancak bir 30x30 dizide ben minimum değer olduğunu hangi satır ve sütun bilmek istiyorum. min fonksiyonun açıklamasınaMATLAB, bir 2D dizisinde minimum değerin indeksini nasıl gösterir?

cevap

28

, minimum değeri elde etmek min birleştirmek ve zaten o zaman sadece bulmak kullanmak minimum hesaplanmış ettiyseniz, indeks dönmek bulabilirsiniz.

>> a=magic(30); 
>> [r,c]=find(a==min(min(a))) 

r = 
    1 
c = 
    8 

Yoksa mantıksal adresleme sana bir doğruluk tablosunu vermek için kullanılabilir, bu durumda bunun yerine bir mantıksal dizi tanımlamak isteyebilirsiniz konum bilgilerini, nasıl kullanmak istediğinize bağlı olarak.

>> a=magic(30); 
>> locn=(a==min(min(a))); 
+0

Teşekkür ederim! tam olarak ihtiyacım olan şey! –

7

bak. Minimum değerin yanı sıra endeksi de döndürebilir. İki boyutlu bir dizi için, sadece iki kez arayın.

A = rand(30); % some matrix 
[minColVal, minColIdx] = min(A); 
[minRowVal, minRowIdx] = min(minColVal); 

minVal = minRowVal; 
minValIdx = [minColIdx(minRowIdx), minRowIdx]; 

Düzenleme: Sen, bir vektöre matrisi yeniden şekillendirmek MIN kullanarak minimum dizinini bulmak ve sonra da bu dönüştürebilirsiniz

13

B3'in çözüm muhtemelen hesaplama daha şık @ (daha hızlı ve ihtiyacı daha az geçici boşluk) bir matris endeksi içine doğrusal endeksi: alternatif sürümü olarak

 
>> x = randi(5, 5) 

x = 

    5  4  4  2  4 
    4  2  4  5  5 
    3  1  3  4  3 
    3  4  2  5  1 
    2  4  5  3  5 

>> [value, index] = min(reshape(x, numel(x), 1)); 
>> [i,j] = ind2sub(size(x), index) 

i = 

    3 


j = 

    2 
+0

+1 zarif çözüm! – groovingandi

+6

, birkaç karakteri kaydetmek için x (:) yerine reshape() kullanabilirsiniz. – zellus

+0

@zellus: Bana hatırlattığın için teşekkür ederim! Bunu yapmanın başka bir yolu olduğu hissini uyandırıyordum. –

0

bir vektör bir alt kümesinde min veya max bulmak için - A vektörü ve "LOWERBOUND" ve "UPPERBOUND" ise max bulmalıyız aralarında vektör sınırları (veya dak) değeri, daha sonra, bu komutu -

[Value,Index]=min(A(lowerBound:upperBound)); 

Bu ofset "LOWERBOUND" gibi dakika ya da maksimum değeri A (LOWERBOUND arasında) ve A (uppedBound) ve "İndeksi" olarak "değeri" olarak geri dönmektedir. Mutlak endeksi bulmak için, Dizine "lowerBound" eklemeniz gerekir.

0

Satır içi bir işlev kullanan alternatif bir çözüm işe yarayacaktır.

>> min_index = @(matrix) find(matrix == min(reshape(matrix, [1,numel(matrix)]))); 

    >> a=magic(30); 
    >> [r,c]=min_index(a) 

    r = 
     1 

    c = 
     8 
İlgili konular