2016-09-12 3 views
0

Ich habe eine Matrix A:Finden Werte nach und stellen ihre Vorkommen in Matrix

U = unique(A) = [0; 11; 21; 22; 23; 34; 45] 

Ohne den Wert 0, ich möchte ein:

A = [23 34 45 0 0 0 ; 
    21 34 0 0 23 11 ; 
    34 23 0 0 0 22 ; 
    23 11 21 0 0 45 ; 
    11 45 23 0 0 0 ] 

ich die eindeutigen Werte in der Matrix gefunden haben Matrix 6x6 (6 ist die Anzahl der gefundenen Werte ohne Null), in der ich die Anzahl der Male darstellen möchte, die ein Wert von einem anderen Wert in jeder Zeile folgt.

Beispiel:

Vorkommen, dass nach 11 gibt 11 ist 0.
Häufigkeit, dass nach 11, gibt es 21 ist 1.
Häufigkeit, dass nach 11, gibt es 22 ist 0.
Häufigkeit, dass nach 11230 ist.
Häufigkeit, dass nach 11340 ist.
Häufigkeit, dass nach 11, gibt es 45 ist 1.

So ist die erste Zeile der Matrix ich will, ist: B = [0 1 0 0 0 1]

Vorkommen, die nach 21 gibt es 11 ist 0.
Vorkommen, dass nach 21, gibt es 21 ist 0.
Häufigkeit, dass nach 21, 220 ist.
Vorkommen, dass nach 21230 ist.
Häufigkeit, dass nach 21, 341 ist.
Häufigkeit, dass nach 21, gibt es 45 ist 1.

So ist die zweite Zeile der Matrix ist

B = [0 1 0 0 0 1; 0 0 0 0 1 1; ...] 

ich den gleichen Vorgang wiederholen möchten, für alle Werte in U.

Können Sie mir helfen?

+0

könnte es viel einfacher sein, wenn Sie 1: 6 für 11 21 etc. ersetzen – GameOfThrows

+0

Ich habe keine Ahnung, wie es geht ...Ich habe gedacht, um alle möglichen Kombination von Werten in der Matrix A zu finden, aber es ist keine kluge Idee – elis56

+0

na, Sie wollen eine 'circshift (A, [0, -1])' verwenden, die Ihnen die Matrix mit all den gibt Elemente, möchten Sie die letzte Zeile von A und diese Matrix löschen. Kombiniere das mit A, dann solltest du mit 5 * 5 oder 25 Zahlensätzen enden, die, wie ich schon sagte, in Koordinaten umgerechnet werden könnten (wenn du sie durch 1: 6 ersetzt) ​​ – GameOfThrows

Antwort

4

dies ist eine mögliche Lösung:

A = [23 34 45 0 0 0 ; 
    21 34 0 0 23 11 ; 
    34 23 0 0 0 22 ; 
    23 11 21 0 0 45 ; 
    11 45 23 0 0 0 ] 
% final result is a 6 * 6 table we want to map from 11; 21; 22; 23; 34; 45 to 1:6 
% first sort the array 
[S SI] = sort(A(:)); 
% then generate mapped values corresponding to original values 
S2=[0; (cumsum(diff(S)>0))]; 
% then replace original with mapped value 
A(SI) = S2; 
% use circshift to create a matrix that brings next element in each row to one left , 
% so current value in original matrix and next value in cricshifted matrix are in the same position. 
C=circshift(A,[0,-1]); 
% so both matrices converted to vectors and horizontally concatenated to a n * 2 matrix (U) , 
% its first column is the current element in each row and second column is the following element. 
% since for example there may be multiple cases of [11 21] , 
% we take unique of the U matrix to remove repeated co-occurances. 
U = unique([A(1:end-size(A,1)); C(1:end-size(A,1))]','rows'); 
% zero values should be discarded then we get indices of rows that contain zero 
[ro ,~] = find(U == 0); 
uro = unique(ro); 
% rows that contain zero excluded from two column matrix (U). 
U(uro,:) =[]; 
% now first column of U contains indices of rows of 1s and second column indices of their columns. 
% then convert indices to 0-1 matrix 
result = full(sparse(U(:,1),U(:,2),1)) 
+0

Fügen Sie auch einige Erklärungen hinzu, um das Verständnis zu erleichtern –

+0

Ich denke, das ist eine großartige Antwort, und es sollte auch super schnell sein (alle parallelisierten Funktionen). – GameOfThrows

+0

@Sardar_Usama Erklärung zur Verfügung gestellt – rahnema1

1

Könnte ein Tippfehler hier irgendwo sein, da ich sans-Compiler arbeiten, aber allgemeine Strategie ist: Mask Erstellen, Anwenden Maske, Graf

U = U(2:end); %Remove 0 value from unique matrix 

output = zeros(length(U)); 

for ii = 1:length(U) 
    maskA = cumsum(A == U(ii),2); #Find any values of A = U(ii), and make them + all to the right equal to 1 
    maskA = [zeros(size(A,1),1) maskA(:,1:size(A,2)-1)] %Shift highlighting to the right one column 
    maskedA = A*maskA; %Filter out only values we want to count 
    for kk = 2:length(U) 
     output(ii,jj) = sum(maskedA(:)==U(ii)); %Count number of matching values 
    end 
end 
Verwandte Themen