2015-06-21 23 views
5

Byłem zachwycony, aby dowiedzieć się, że Julia pozwala pięknie zwięzły sposób, aby tworzyć produkty wewnętrzna:Jaki jest najlepszy sposób tworzenia wewnętrznych produktów?

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

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

Ta alternatywa dot(x,y) jest ładny, ale może prowadzić do niespodzianek:

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 

Tak, a ja "chciałbym napisać x'y, wydaje się najlepiej go unikać, ponieważ w przeciwnym razie muszę być świadomy pułapek związanych z skalarami w porównaniu do matryc 1-do-1.

Ale jestem nowa dla Julii i prawdopodobnie nie myślę we właściwy sposób. Czy inni używają tej zwięzłej alternatywy dla dot, a jeśli tak, to kiedy jest to bezpieczne?

+2

To nie jest bardzo jasne, co trzeba (lub nie) i co jesteś w stanie poświęcić, więc nie jestem delegowania odpowiedź: Można użyć [ '] (⋅' operatora http://julia.readthedocs.org/en/latest/stdlib/linalg/#Base.⋅) zamiast "kropka". Możesz również zadeklarować (http://julia.readthedocs.org/en/latest/manual/types/#type-declarations) jakiego typu oczekujesz dla funkcji zmiennej/zwracającej: 'x = [0; 1]: : Array {Float64,1} ' –

Odpowiedz

4

Istnieje tutaj problem koncepcyjny. Po wykonaniu tej czynności jest ona przekształcana w produkt z macierzą * o wymiarach odpowiednio 2x1 i 1, co daje macierz 1x1. Inne języki, takie jak MATLAB, nie rozróżniają macierzy 1x1 i skalarnej, ale Julia robi z różnych powodów. Dlatego nigdy nie jest bezpieczne używanie go jako alternatywy dla "prawdziwej" funkcji produktu wewnętrznego, która jest zdefiniowana jako zwracająca wynik skalarny.

Teraz, jeśli nie jesteś fanem dot s, możesz rozważyć sum(x.*y) z sum(x'y). Pamiętaj też, że wektory kolumn i wierszy są różne: w rzeczywistości nie ma czegoś takiego jak wektor wierszy w Julii, więcej niż macierz 1xN. Więc masz rzeczy jak

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. 

Błąd wiadomość sugestia jest dot(vec(x),vec(y), ale sum(x.*y) działa również w tym przypadku i jest krótszy.

julia> sum(x.*y) 
10 

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

' kropka ([1,2,3], [4,5,6]) 'teraz działa na nocnej kompilacji. –

Powiązane problemy