2016-03-29 17 views
0

3 yer ve 4 kişi arasındaki mesafelerin bir D matrisi D var (D) (2,3) = 10 kişi 3'ün 10 birimden 2'sinden çok uzakta olduğu anlamına gelir.Bir matriste satırların elemanlarını başka bir matrisle sırala

D=[23 54 67 32 
    32 5 10 2 
    3 11 13 5] 

satır sayısına eşit sayıda (3 yerler) ve A (i :) ile bir matris bir yer 1 yer i

örnek aldı kişilere tekabül kişi 1 ve 3 aldı Bu herhangi bir yerden 2 ve kişileri 2 aldı ve 4. yer aldı 3 A = [1 3 0 2 4 0] I yakın olan kişiler tarafından A'nın her satır düzenlemek istediğiniz

temsil ettiği yere. Bu örnekte, yer 1 için, kişi 1, D'ye göre kişi 3'ten daha yakındır, dolayısıyla yapılacak hiçbir şey yoktur. hiçbir yere 2 yapmak için ve kişinin 4 3 D (3,2)> D yerleştirmek için 2'den daha yakın olduğu yerde 3 için bir değişiklik vardır (3,4)

sonucu olmalıdır

A (yer) içinde

Temelde, D satır göre bir, her satırda elemanları (düzenlemek istediğiniz (aldı kişi), 0 ya da olmayan pek çok sıfır elemanları olabilir

A=[1 3 
    0 0 
    4 2 ] 

her satır konumun en yakınına ilk gelir), bunun gibi bir şey ama burada A ve D aynı boyutta değil (sütun sayısı).

[SortedD,Ind] = sort(D,2) 


    for r = 1:size(A,1) 
     A(r,:) = A(r,Ind(r,:)); 
    end 
+0

bu ne dili böyle:, böyle bir şey yapabilirsiniz

Daha spesifik olmak gerekirse? Matlab mı? Dili bir etiket olarak eklemelisiniz. –

cevap

0

Başka bir Matlab işlevi var sortrows(C,colummn_index) bu işi yapabilir. Belirli bir sütundaki öğelere göre satırları sıralayabilir. Bu nedenle, matrisinizi A (C = A') aktarırsanız ve sonucu, istenen sırayı sıralamak istediğiniz uygun sütuna ekleyerek uzatırsanız, istediğinizi elde edersiniz.

clear all 

D=[23 54 67 32; 
    32 5 10 2; 
    3 11 13 5]; 

A=[1 0; 
    3 0; 
    4 2 ]; 

% Sort elements in each row of the matrix A, 
% because indices of elements in each row of the matrix D are always 
% ascending. 
A_sorted = sort(A,2); 
% shifting all zeros in each row to the end 
for i = 1:length(A_sorted(:,1)) 
    num_zeros = sum(A_sorted(i,:)==0); 
    if num_zeros < length(A_sorted(i,:)) 
     z = zeros(1,num_zeros); 
     A_sorted(i,:) = [A_sorted(i,num_zeros+1:length(A_sorted(i,:))) z]; 
    end; 
end; 

% Prelocate in memory an associated array of the corresponding elements in 
% D. The matrix Dr is just a reduced derivation from the matrix D. 
Dr = zeros(length(A_sorted(:,1)),length(A_sorted(1,:))); 

% Create a matrix Dr of elements in D corresponding to the matrix A_sorted. 
for i = 1:length(A_sorted(:,1)) % i = 1:3 
    for j = 1:length(A_sorted(1,:)) % j = 1:2 
     if A_sorted(i,j) == 0 
      Dr(i,j) = 0; 
     else 
      Dr(i,j) = D(i,A_sorted(i,j)); 
     end; 
    end; 
end; 

% We don't need the matrix A_sorted anymore 
clear A_sorted 

% In order to use the function SORTROWS, we need to transpose matrices 
A = A'; 
Dr = Dr'; 

% The actual sorting procedure starts here. 
for i = 1:length(A(1,:)) % i = 1:3 
    C = zeros(length(A(:,1)),2); % buffer matrix 
    C(:,1) = A(:,i); 
    C(:,2) = Dr(:,i); 
    C = sortrows(C,2); 
    A(:,i) = C(:,1); 
    % shifting all zeros in each column to the end 
    num_zeros = sum(A(:,i)==0); 
    if num_zeros < length(A(:,i)) 
     z = zeros(1,num_zeros); 
     A(:,i) = [A(num_zeros+1:length(A(:,i)),i) z]'; 
    end; 
end; 

% Transpose the matrix A back 
A = A'; 

clear C Dr z 
+0

Ama burada sıralama matrisine dayanıyor D tek bir sütun değil –

+0

Tam olarak matrisinizi nasıl sıralamak istediğinizi tam olarak anlamıyorum. Daha açık bir şekilde açıklar mısınız lütfen? –

+0

Bir sonraki soru şudur: A neden matris 3x4 değil? Örneğin, eğer herkes ilk yeri seçerse, o zaman A matrisinin ilk satırında 4 element bulunmalıdır, böyle bir şey: A = [1 3 2 4; 0 0 0 0; 0 0 0 0]. Sağ? Yani A matrisinin nasıl oluştuğu açık değildir, bunun anlamı açıktır ancak matrisin formuna karşılık gelmez. –

İlgili konular