2015-06-21 21 views
5

Ich war erfreut zu erfahren, dass Julia eine schön prägnante Art und Weise ermöglicht, innere Produkte zu bilden:Was ist der beste Weg, um innere Produkte zu bilden?

julia> x = [1;0]; y = [0;1]; 

julia> x'y 
1-element Array{Int64,1}: 
0 

Diese Alternative zu dot(x,y) ist schön, aber es kann zu Überraschungen führen:

julia> @printf "Inner product = %f\n" x'y 
Inner product = ERROR: type: non-boolean (Array{Bool,1}) used in boolean context 

julia> @printf "Inner product = %f\n" dot(x,y) 
Inner product = 0.000000 

So, während ich Ich würde gerne schreiben x'y, es scheint am besten, es zu vermeiden, da ich sonst Fallstricke im Zusammenhang mit Skalaren gegen 1-by-1-Matrizen bewusst sein muss.

Aber ich bin neu zu Julia, und wahrscheinlich denke ich nicht in der richtigen Weise. Verwenden andere diese prägnante Alternative zu dot, und wenn ja, wann ist dies sicher?

+2

Es ist nicht ganz klar, was Sie brauchen (oder nicht) und was sind Sie bereit zu opfern, so Posting ich keine Antwort: Sie können die [ '⋅' Operator] verwenden (http://julia.readthedocs.org/en/latest/stdlib/linalg/#Base.⋅) anstelle von 'dot'. Sie können auch [declare] (http://julia.readthedocs.org/en/latest/manual/types/#type-declarations) angeben, welchen Typ Sie für eine Variable/Rückgabe-Funktion erwarten: 'x = [0; 1]: : Array {Float64,1} ' –

Antwort

4

Es gibt ein konzeptionelles Problem hier. Wenn Sie das tun

julia> x = [1;0]; y = [0;1]; 
julia> x'y 
0 

, der tatsächlich in einer Matrix * Vektorprodukt mit Abmessungen von 2x1 bzw. 1 gedreht wird, in einer 1x1-Matrix ergibt. Andere Sprachen, wie MATLAB, unterscheiden nicht zwischen einer 1x1-Matrix und einer skalaren Größe, aber Julia tut dies aus einer Vielzahl von Gründen. Es ist daher niemals sicher, es als Alternative zu der "wahren" inneren Produktfunktion dot zu verwenden, die definiert ist, um eine skalare Ausgabe zurückzugeben. Wenn Sie kein Fan der dot s sind, können Sie sum(x.*y) von sum(x'y) betrachten. Denken Sie auch daran, dass Spalten- und Zeilenvektoren unterschiedlich sind: In Julia gibt es keinen Zeilenvektor, mehr gibt es nur eine 1xN-Matrix. So bekommt man Dinge wie

julia> x = [ 1 2 3 ] 
1x3 Array{Int64,2}: 
1 2 3 

julia> y = [ 3 2 1] 
1x3 Array{Int64,2}: 
3 2 1 

julia> dot(x,y) 
ERROR: `dot` has no method matching dot(::Array{Int64,2}, ::Array{Int64,2}) 

You might have used a 2d row vector where a 1d column vector was required. 
Note the difference between 1d column vector [1,2,3] and 2d row vector [1 2 3]. 
You can convert to a column vector with the vec() function. 

Die Fehlermeldung Vorschlag ist dot(vec(x),vec(y), aber sum(x.*y) funktioniert auch in diesem Fall und ist kürzer.

julia> sum(x.*y) 
10 

julia> dot(vec(x),vec(y)) 
10 
+0

' dot ([1,2,3], [4,5,6]) 'funktioniert jetzt bei nächtlichen Builds. –

Verwandte Themen