2016-08-21 4 views
2

Ich denke, die Frage ist ziemlich einfach, aber immer noch beschäftigt mich seit einiger Zeit.Position der ganzen Zahlen in Vektor

Nehmen wir an, wir einen Vektor mit 4 ganzen Zahlen zufällig repetetive haben, wie:

v = [ 1 3 3 3 4 2 1 2 3 4 3 2 1 4 3 3 4 2 2] 

ich für den Vektor aller Positionen jeder integer bin auf der Suche, z.B. 1 sollte es einen Vektor sein wie:

position_one = [1 7 13] 

Da ich jede Zeile einer 100x10000 Matrix gesucht werden soll ich war mit linearem Indizes beschäftigt nicht in der Lage.

Vielen Dank im Voraus!

+0

wird 'position_one gibt = finden (v == 1) 'mach die Arbeit für dich oder du brauchst etwas anspruchsvolleres? – brainkz

+0

mein Problem mit find war, dass Sub2ind hatte ein Problem mit den linearen Indizes und ich konnte nicht herausfinden, warum;), aber ich werde versuchen, mit der zweiten Antwort gehen, da ich schon etwas ähnliches begonnen habe ..... danke für die Hilfe! – gwendolinese

Antwort

0

Zeilen und Spalten

Da die Ausgabe für alle Integer-Änderungen , ein Zellen-Array wird die gesamte Aufgabe erfüllen. Für die gesamte Matrix, können Sie so etwas wie:

A = randi(4,10,30); % some data 
Row = repmat((1:size(A,1)).',1,size(A,2)); % index of the row 
Col = repmat((1:size(A,2)),size(A,1),1); % index of the column 
pos = @(n) [Row(A==n) Col(A==n)]; % Anonymous function to find the indices of 'n' 

als für jeden n Sie schreiben können:

>> pos(3) 
ans = 
    1  1 
    2  1 
    5  1 
    6  1 
    9  1 
    8  2 
    3  3 
    .  . 
    .  . 
    .  . 

wobei die erste Spalte die Zeile ist, und die zweite ist die Spalte für jede Instanz von n in A.

Und für alle n s können Sie verwenden, um eine arrayfun:

positions = arrayfun(pos,1:max(A(:)),'UniformOutput',false) % a loop that goes over all n's 

oder eine einfache for Schleife (schneller):

positions = cell(1,max(A(:))); 
for n = 1:max(A(:)) 
    positions(n) = {pos(n)}; 
end 

Der Ausgang in beiden Fällen würde ein Zellenfeld sein:

positions = 
    [70x2 double] [78x2 double] [76x2 double] [76x2 double] 

und für jede n können Sie positions{n}, schreiben zum Beispiel zu bekommen:

>> positions{1} 
ans = 
    10  1 
    2  3 
    5  3 
    3  4 
    5  4 
    1  5 
    4  5 
    .  . 
    .  . 
    .  . 

Nur Reihen

Wenn alles, was Sie je eine bestimmte Zeile in der Spalte indizieren möchten und n, können Sie schreiben:

A = randi(4,10,30); 
row_pos = @(k,n) A(k,:)==n; 
positions = false(size(A,1),max(A(:)),size(A,2)); 
for n = 1:max(A(:)) 
    positions(:,n,:) = row_pos(1:size(A,1),n); 
end 

jetzt, positions ist eine logische 3-D-Array, dass jede Zeile entspricht einer Zeile in A, jede Spalte entspricht einem Wert von n, und die dritte Dimension ist der Anwesenheitsvektor für die Kombination von Zeile und n. Auf diese Weise können wir R werden der Spaltenindex definieren:

R = 1:size(A,2); 

und dann die entsprechenden Positionen für eine bestimmte Zeile und n finden. Zum Beispiel ist der Spaltenindizes n=3 in Zeile 9:

>> R(positions(9,3,:)) 
ans = 
    2  6 18 19 23 24 26 27 

dies wäre genau wie find(A(9,:)==3) nennen, aber wenn Sie dies viele Male ausführen müssen, die alle Indizes finden und speichert sie in positions (was logisch, so ist es nicht so groß) wäre schneller.

0

Finden Sie lineare Indizes in einer Matrix: I = find(A == 1).
Suchen Sie zweidimensionale Indizes in Matrix A: [row, col] = find(A == 1).

%Create sample matrix, with elements equal one: 
A = zeros(5, 4); 
A([2 10 14]) = 1 

A = 

    0  0  0  0 
    1  0  0  0 
    0  0  0  0 
    0  0  1  0 
    0  1  0  0 

Finden diejenigen als linearer Indizes in A:

find(A == 1) 

ans = 

    2 
    10 
    14 

%This is the same as reshaping A to a vector and find ones in the vector: 
B = A(:); 
find(B == 1); 

B' = 

    0  1  0  0  0  0  0  0  0  1  0  0  0  1  0  0  0  0  0  0 

finden zweidimensionalen Indizes:

[row, col] = find(A == 1) 

row = 

    2 
    5 
    4 


col = 

    1 
    2 
    3 
+0

danke, ich werde versuchen, mit diesem zu gehen! – gwendolinese

0

können Sie tun das mit accumarray ein anonymous function wie folgt verwendet:

positions = accumarray(v(:), 1:numel(v), [], @(x) {sort(x.')}); 

Für

v = [ 1 3 3 3 4 2 1 2 3 4 3 2 1 4 3 3 4 2 2]; 

diese

positions{1} = 
    1  7 13 
positions{2} = 
    6  8 12 18 19 
positions{3} = 
    2  3  4  9 11 15 16 
positions{4} = 
    5 10 14 17 
Verwandte Themen