Julia 与'混淆;运算符和括号,其中(v';)*v在重载情况下变为Ac#u mul#B

Julia 与'混淆;运算符和括号,其中(v';)*v在重载情况下变为Ac#u mul#B,julia,Julia,我在Julia中玩弄CoVectors的想法,并从解析器/编译器中获得了一些我没有预料到的行为。我定义了一个新的CoVector类型,它是任何向量的ctranspose,只是一个简单的修饰: type CoVector{T<:AbstractVector} v::T end 接下来我想定义一个简单的点积 function *(x::CoVector,y::AbstractVector) return dot(x.v,y) end 这可以很好地用于: v = [1,2,3

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

type CoVector{T<:AbstractVector}
    v::T
end
接下来我想定义一个简单的点积

function *(x::CoVector,y::AbstractVector)
    return dot(x.v,y)
end
这可以很好地用于:

v = [1,2,3]
cv = v'
cv*v
返回
14
,并且
cv
CoVector
。但如果我这样做了

(v') * v
我得到了一些不同的东西!在这种情况下,它是一个包含
14
的单元素数组。为什么括号不能按我的预期工作

最后,我们看到表达式被扩展为
Ac_mul_B
,默认为
[dot(A,B)]
,并且这种解释似乎是在“操作符”级别定义的

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


我想我可以通过重新定义
Ac\u mul\u B
来解决这个问题,但我很惊讶,根据我上面的定义,它竟然被调用了。

你可以在解释
*
之前,执行
@eval(v')*v
来强制转换到
CoVector
,但我不知道这是否有帮助。就我而言,这只是猜测,但是
*
的调度似乎很复杂,因为在应用重新定义的
ctranspose
操作之前,它被解释为矩阵乘法。然后朱莉娅非常明智地说,一对向量是
[dot(a,B)]
。我(到目前为止)在朱莉娅美妙的打字系统中缺乏成熟度,所以我不能提供更多。请,请,请不要用eval来处理这样的事情。解析器不注意parens。我会在另一条线上做转置。不,我觉得这不像是调度
(v')*v
ctranspose(v)*v
不同。为
转置(cv::CoVector)
添加适当的模拟也没有帮助。因此,至少在这种情况下,
似乎与
ctranspose
@StefanKarpinski不一样,谢谢你对我的评论的更正。这是新手犯的错误(毕竟我是新手)。后来我意识到,我应该说
ctranspose(v)
。对我来说,这是纠正评论的正确方法,还是保持原样,依靠你的评论来保持事情的正确性。我喜欢把事情做得很好,所以我很感激任何更正和建议。。。但我还有几个问题要问。首先,该函数明确声明,您可以通过设置
ctranspose
函数来控制
'
的使用,就像它是一种别名/语法糖一样,因此,如果这不是真的,也许可以澄清这一点。我觉得
Symbol call
call
相反,发生了一些有趣的事情,这是没有文档记录的。
(v') * v