2015-03-02 45 views
1

我是相當通過以下不解,使用朱莉婭迭代器作爲常規載體

sqrt(1:3) * [1 2 3] 
# 3x3 Matrix, as expected 
sqrt(1:3) * 1:3 
# error `colon` has no method matching... 

,直到我意識到,1:3必須成爲一個不同的野獸,即不只是一個載體,我從預期Matlab的。我目前的解決方法是使用hcat將其轉換爲矢量,sqrt(1:3) * hcat(1:3...),有沒有更好的方法?

回答

2

typeof(1:3)給出UnitRange{Int64} (constructor with 1 method),而typeof([1:3])給出:Array{Int64,1}。需要注意的是[1:3]是默認的列向量,所以你需要轉它:sqrt(1:3) * [1:3].'

+0

謝謝,我沒有想過用'[]'來執行轉換。它會等同於'convert(Array,1:3)。''? – baptiste 2015-03-02 06:48:55

+0

顯然它們不是等價的。如果你在行的開始處加上@ @ which,你可以看到abstractarray.jl的基礎茱莉亞的哪一行正在做它,這很棒!例如:'@which [1,2,3]'在abstractarray.jl:518'處給出:'vcat {T <:Number}(X :: T <:Number ...)。 – Pooya 2015-03-02 14:09:20

5

的主要問題與第二個版本

sqrt(1:3) * 1:3 

實際上是運算符優先級。冒號運算符是非常低的優先級,所以這相當於

(sqrt(1:3) * 1):3 

這是荒謬的,因此錯誤

ERROR: `colon` has no method matching colon(::Array{Float64,1}, ::Int64)` 

說了這麼多,如果你用括號「修理」它不工作因爲操作員沒有定義。因此你可能需要sqrt(1:3) * [1:3]'

+0

事實上,這是我的第一個想法,但我嘗試了括號,並且出現了錯誤,所以我停止了這一點,並承認失敗 – baptiste 2015-03-02 07:40:23

+0

請注意'sqrt(1:3)*(1:3)''也適用。 – tholy 2015-03-02 14:20:39