【问题标题】:use a julia iterator as a regular vector使用 julia 迭代器作为常规向量
【发布时间】:2015-03-02 04:55:03
【问题描述】:

我对以下内容感到很困惑,

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...),有没有更好的方法?

【问题讨论】:

    标签: vector iterator julia


    【解决方案1】:

    第二个版本的主要问题

    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]'

    【讨论】:

    • 确实,这是我的第一个想法,但我用括号尝试过,也出现了错误,所以我在那个时候停下来承认失败
    【解决方案2】:

    typeof(1:3) 给出UnitRange{Int64} (constructor with 1 method),而typeof([1:3]) 给出:Array{Int64,1}。注意[1:3]默认是列向量,所以需要转置:sqrt(1:3) * [1:3].'

    【讨论】:

    • 谢谢,我没想过使用[] 来执行转换。是否等同于convert(Array,1:3).'
    • 显然它们是不等价的。如果您将@which 放在行首,您可以看到abstractarray.jl 的base julia 中的哪一行正在执行此操作,顺便说一句,这很棒!例如:@which [1,2,3] 给出:vcat{T<:Number}(X::T<:Number...) at abstractarray.jl:518
    猜你喜欢
    • 2010-12-23
    • 2018-04-20
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多