2015-06-08 17 views
6

Con x = Any[[1,2],[2,3],[3,4],[4,5]], ho provato la seguente linea con Julia0.4.0corrispondenza degli elementi di un array a Julia

x[ x .== [3,4] ] 

ma si è tradotto in un errore

ERROR: DimensionMismatch("arrays could not be broadcast to a common size") 

mi aspettavo di dare qualcosa di simile, perché Any[ [3,4] ]

x[3] == [3,4] # => true 

non è un problema. Sebbene questa operazione possa non essere utile, vorrei sapere cosa significa il messaggio di errore. Quindi apprezzerei qualsiasi suggerimento sul perché si verifichi questo errore.

risposta

5

Per eseguire un confronto elemento per elemento, Julia richiede che entrambi gli array abbiano lo stesso numero di elementi. Ciò può essere ottenuto in questo caso con la comprensione:

julia> x = Any[[1,2],[2,3],[3,4],[4,5]] 
4-element Array{Any,1}: 
[1,2] 
[2,3] 
[3,4] 
[4,5] 

julia> x[x.==[[3,4] for i in 1:length(x)]] 
1-element Array{Any,1}: 
[3,4] 

Quindi la domanda nella mia mente era "perché non Julia trasmesso la [3,4] in questa forma automaticamente?". L'esempio che segue viene trasmesso correttamente:

julia> y = [1,2,3,4] 
4-element Array{Int64,1}: 
1 
2 
3 
4 

julia> y.==3 
4-element BitArray{1}: 
false 
false 
    true 
false 

julia> y[y.==3] 
1-element Array{Int64,1}: 
3 

Sembra che il meccanismo di trasmissione di Julia è in grado di dedurre che vogliamo [3,4] che andrà in onda in [[3,4],[3,4],[3,4],[3,4]] piuttosto che qualche altra forma di array.

+1

Grazie mille per la spiegazione. Ora capisco cosa significa "broadcast" in questo messaggio di errore. Ho anche confermato che '@show x [x. == [[3,4] per i = 1: length (x)]] => Any [[3,4]]' (questa è già una grande sorpresa per me !) Allo stesso modo, 'x. == 1',' x. == "hi" ', e' x. == [1] 'tutto ha funzionato (dando un' Qualsiasi [] ') vuoto. Quindi sembra che Julia non sia felice con questo [[3,4] 'o simili ... – roygvib

3

Si può aiutare Julia un po 'a capire come trasmettere la seconda variabile scrivendo il confronto in questo modo:

julia> x .== Any[[3, 4]] 

Si ottiene un BitArray come previsto:

4-element BitArray{1}: 
false 
false 
    true 
false 

Così l'indicizzazione con il risultato del confronto funziona anche:

julia> x[ x .== Any[[3,4]] ] 
1-element Array{Any,1}: 
[3,4] 
Problemi correlati