2014-10-04 11 views
5

In Julia Sie die Koordinaten von Elementen in einer Matrix über finden:julia finden in Matrix mit (Zeile, Spalte) anstelle von Index

julia> find(x -> x == 2, [ 1 2 3; 2 3 4; 1 0 2]) 
3-element Array{Int64,1}: 
2 
4 
9 

Diese Werte sind korrekt, aber ich würde es vorziehen, dass ich bekommen die (Zeile, Spalte) Tupel statt.

(1,2) 
(2,1) 
(3,3) 

Was ist der einfachste Weg, dies in Julia zu erreichen?

Antwort

4

Ich glaube nicht, dass es eine eingebaute Möglichkeit, es zu tun, aber hier ist eine Funktion es

function findmat(f, A::AbstractMatrix) 
    m,n = size(A) 
    out = (Int,Int)[] 
    for i in 1:m, j in 1:n 
    f(A[i,j]) && push!(out,(i,j)) 
    end 
    out 
end 

zum Beispiel zu tun

julia> findmat(x->x==2, [ 1 2 3; 2 3 4; 1 0 2]) 
3-element Array{(Int64,Int64),1}: 
(1,2) 
(2,1) 
(3,3) 

Wenn eine große Anzahl von Elementen die Bedingung erfüllen, kann es effizienter sein, es in zwei Durchgängen zu tun, aber ich bezweifle es.

2

wenn Sie es wünschen „neuen“ Funktionen zu vermeiden, definieren, vielleicht:

collect(zip(ind2sub((3,3),find(x -> x == 2, [ 1 2 3; 2 3 4; 1 0 2]))...)) 

ist, was Sie suchen. das (3,3) ist implizit in der Größe der Matrix. wenn die Matrix durch eine Variable gegeben wäre es natürlich aussieht mit einer size(M)

3

der nächsten Sache, die ich in der Julia Standard-Bibliothek finden kann, ist findn:

julia> A = [1 2 3; 2 3 4; 1 0 2] 
3x3 Array{Int64,2}: 
1 2 3 
2 3 4 
1 0 2 

julia> findn(A .== 2) 
([2,1,3],[1,2,3]) 

Dies ein Tupel von Vektoren gibt statt ein Vektor von Tupeln, obwohl.

Eine andere Sache zu beachten ist, dass das Spiel bei (2,1) vor dem bei (1,2) gemeldet wird. Dies liegt daran, dass die Arrays in Julia in der Reihenfolge der Spaltenreihenfolge gespeichert sind. Wenn Sie also das Array A in Speicherreihenfolge scannen, wird die Position (2,1) vor (1,2) angezeigt.

+0

'' 'findn ([2 2; 2 2]. == 2)! = [(1,1), (1,2), (2,1), (2,2)] '' – cantdutchthis

+0

Ich habe meine Antwort aktualisiert, um diesen Punkt jetzt aufzugreifen. –

1

Falls jemand anderes dieses findet man nun verwenden können:

ind2sub(a, index) 

Es gibt ein Tupel von Indizes in Array a an den linearen Index entspricht index

+0

das ist nicht, was von OP gesucht wird, wollen sie nach Wert suchen – muon

Verwandte Themen