2016-03-26 13 views
0

Bir dizi içinde birden çok sayı var ve her biri en iyi sonucu arasındaki farkı bulmak istiyorum (öğeleri tekrarlamak istemiyorum). Her şeyi permütasyon Sayıların permütasyonlarının farkını bulma ve sonuca göre sıralama

v = [120;124;130]; 
p = perms(v) 

alır çünkü komut "perma" seçeneğini kullanarak denedik ama ben istiyorum şekilde çalışmak görünmüyor. Herkes başka öneri

Örnek var mı: Ben 3 numara var a = [120124130] (sayılar yüzlerce olabileceğini lütfen unutmayın) ve daha sonra sıralama sonucu tarafından, sayılar arasındaki farklılıkları bulur. Hesaplamalar aşağıdaki metin gibi görünecekti.

124-120 =4 
130-124 =6 
130-120 =10 

Yani nihai dizi b

b= 
    [124 120 4 
    130 124 6 
    130 120 10] 

PS altında dizisi gibi görünecektir: Ben matlab gibidir oktav 3.8.1 kullanıyorum

+0

@Amro gider vektör. O zaman sonuçla tam olarak ne yapmak istiyorsun? sıralanan farklılıkları saklamak? Bu son kısım belli değil. Burada beklenen sonuç nedir? Bu PDIST fonksiyonuna benzer geliyor .. – Amro

+0

Evet Son dizinin sorunun içinde nasıl görüneceğini ekledim. –

cevap

0

Biz PDIST işlevini kullanabilirsiniz çiftli uzaklıkları hesaplayın, ardından vektörün orijinal değerlerine endeks almak için ndgrid ve tril bir arada kullanın. Nihayet bir nevi mesafelere göre kullanarak: istatistik araç kutusu sayesinde yükleyemediğinizi olanlar için

v = [120;124;130]; 
D = pdist(v, 'cityblock'); 
[a,b] = ndgrid(1:numel(v), 1:numel(v)); 
out = sortrows([v(nonzeros(tril(a,-1))) v(nonzeros(tril(b,-1))) D(:)], 3) 
+0

Bu harika görünüyor ama pdist işlevine erişimim yoksa ne olur? –

+0

işlev, istatistik araç kutusundadır (hem MATLAB hem de Octave). Her neyse, uygulamak zor değildir, sadece her sayı çifti arasındaki mesafeyi/farkı hesaplarsınız. Sadece dün PDIST2'nin farklı uygulamalarını gösteren bir yanıt yayınladım (PDIST'e oldukça benzer, “kare formülü (pdist2 (v, v))' pdist (v) 'gibidir, çünkü PDIST yalnızca başka bir şekilde simetrik matrisin alt yarısını döndürür): http://stackoverflow.com/a/36225650/97160 – Amro

+0

Teşekkürler tüm istatistik araç kutusunu yüklemek istemedim –

0

böylece bir sayı tüm çiftleri arasındaki farkları bulmak istiyorum

v = [120;124.6;130]; 
%taken out from pdist.m from statistics package 
order = nchoosek(1:rows(v),2); 
Xi = order(:,1); 
Yi = order(:,2); 
X = v'; 
d = X(:,Xi) - X(:,Yi); 
y = norm (d, "cols"); 

[a,b] = ndgrid(1:numel(v), 1:numel(v)); 
out = sortrows([v(nonzeros(tril(a,-1))) v(nonzeros(tril(b,-1))) y(:)], 3) 

out= 
    124.6000 120.0000  4.6000 
     130.0000 124.6000  5.4000 
     130.0000 120.0000 10.0000 
İlgili konular