与'运营商和包围相混淆,其中(v')* v尽管超载仍变为Ac_mul_B

时间:2015-02-09 09:26:02

标签: julia

我正在玩Julia中CoVectors的想法,并且我得到了一些我从解析器/编译器中得不到的行为。我定义了一个新的CoVector类型,它是任何向量的ctranspose,只是一个简单的装饰:

type CoVector{T<:AbstractVector}
    v::T
end

可以使用' ctranspose创建(和不创建)它们:

import Base.ctranspose

function CoVector(T::DataType,d::Integer=0)
    return CoVector(Array(T,d))
end

function Base.ctranspose(cv::CoVector)
    return cv.v
end

function Base.ctranspose(v::AbstractVector)
    return CoVector(v)
end

function Base.ctranspose(v::Vector) # this is already specialized in Base
    return CoVector(v)
end

接下来我想定义一个简单的点积

function *(x::CoVector,y::AbstractVector)
    return dot(x.v,y)
end

哪种方法可以正常使用:

v = [1,2,3]
cv = v'
cv*v

返回14cvCoVector。但是如果我做的话

(v') * v

我得到了不同的东西!在这种情况下,它是包含14的单个元素数组。为什么括号怎么会按照我的预期工作呢?

最后,我们看到表达式扩展为Ac_mul_B,默认为[dot(A,B)],似乎这种解释是在&#34;运算符&#34;水平。

这是预期的行为吗? Julia可以完全忽略我的包围并根据需要更改表达式吗?在Julia我喜欢我可以覆盖Base中的内容但是是否也可以对运算符的应用进行自我更改?我看到表达式没有头call但是Symbol call ...这在Julia 0.4中有变化吗? (我在某处读到call正变得越来越普遍)。

我想我可以通过重新定义Ac_mul_B来解决问题,但鉴于我的上述定义,我很惊讶它完全被调用了。

0 个答案:

没有答案