2015-06-21 5 views
5

मैं जानने के लिए जूलिया भीतरी उत्पादों के रूप में एक खूबसूरती से संक्षिप्त रास्ता की अनुमति देता है कि प्रसन्नता हुई:आंतरिक उत्पादों को बनाने का सबसे अच्छा तरीका क्या है?

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

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

dot(x,y) के लिए यह विकल्प अच्छा है, लेकिन यह आश्चर्य का कारण बन सकता: तो जब मैं

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 

x'y लिखना पसंद है, यह इससे बचने के लिए सबसे अच्छा लगता है, अन्यथा मुझे 1-दर-1 मैट्रिस बनाम स्केलर्स से संबंधित नुकसान के बारे में जागरूक होना चाहिए।

लेकिन मैं जूलिया के लिए नया हूं, और शायद मैं सही तरीके से सोच नहीं रहा हूं। क्या अन्य dot पर इस संक्षिप्त विकल्प का उपयोग करते हैं, और यदि ऐसा है, तो ऐसा करने के लिए सुरक्षित कब है?

+2

यह बहुत स्पष्ट है कि तुम क्या जरूरत है (या नहीं) और आप क्या बलिदान करने के लिए तैयार हैं नहीं है, इसलिए मैं एक उत्तर पोस्ट नहीं कर रहा हूँ: आप [ '⋅' ऑपरेटर] का उपयोग कर सकते (http://julia.readthedocs.org/en/latest/stdlib/linalg/#Base.⋅) 'dot' के बजाय। आप [घोषित] भी कर सकते हैं (http://julia.readthedocs.org/en/latest/manual/types/#type-declarations) आप एक चर/वापसी समारोह के लिए किस प्रकार की अपेक्षा करते हैं: 'x = [0; 1]: : ऐरे {Float64,1} ' –

उत्तर

4

यहां एक वैचारिक समस्या है। आप

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

कि वास्तव में क्रमश: 2x1 के आयामों और 1 के साथ एक मैट्रिक्स * वेक्टर उत्पाद में बदल गया है, एक 1x1 मैट्रिक्स में जिसके परिणामस्वरूप करते हैं। MATLAB जैसे अन्य भाषाएं, 1x1 मैट्रिक्स और स्केलर मात्रा के बीच अंतर नहीं करती हैं, लेकिन जूलिया कई कारणों से करता है। इस प्रकार इसे "सत्य" आंतरिक उत्पाद फ़ंक्शन dot के विकल्प के रूप में उपयोग करने के लिए कभी भी सुरक्षित नहीं है, जिसे स्केलर आउटपुट लौटने के लिए परिभाषित किया गया है।

अब, यदि आप dot एस के प्रशंसक नहीं हैं, तो आप sum(x.*y)sum(x'y) पर विचार कर सकते हैं। यह भी ध्यान रखें कि कॉलम और पंक्ति वैक्टर अलग हैं: असल में, जूलिया में पंक्ति वेक्टर जैसी कोई चीज नहीं है, और यह भी कि 1xN मैट्रिक्स है। तो अगर आप की तरह

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. 

त्रुटि संदेश सुझाव dot(vec(x),vec(y) है, लेकिन sum(x.*y) भी इस मामले में काम करता है और कम है चीजों को मिलता है।

julia> sum(x.*y) 
10 

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

' डॉट ([1,2,3], [4,5,6]) अब रात के निर्माण पर काम करता है। –

संबंधित मुद्दे