将行向量和列向量相乘,我期望结果是标量,但它是一个一维、单元素数组:
julia> [1 2 3] * [4; 5; 6]
1-element Array{Int64,1}:
32
问题1:这背后的理由是什么?
问题 2:将此视为 Julia 的一个怪癖,我想将 1 元素数组转换为标量。使用 [1] 获取第一个元素是一种选择,但可读性不太好。做到这一点的特殊方法是什么?
每个表达式都可以被执行,所以你可以使用
([1 2 3] * [4; 5; 6])[1]
获得第一个(也是唯一的值)。
这有主要的性能原因:类型稳定性。基本上,在编译语言中,如果不进行大量转换,就无法更改类型。 Julia 更聪明一点,但如果您进行大量转换,那么您的代码会变慢,因为编译器必须保留大量“kruft”,以防万一您的类型错误。因此,通过确保类型稳定性,编译器可以提前知道类型是什么,并进行更多优化。这是其中之一表现技巧 http://docs.julialang.org/en/release-0.4/manual/performance-tips/。事实上,由于多重调度和类型稳定性,Julia 很快并达到了 C 速度,因此应该受到尊重。
Array * Array 给出一个数组。为了使其类型稳定,它必须始终给出一个数组。否则,编译器需要在使用输出的每个地方放置额外的代码来检查该变量是否是数组!因此,您应该将 * 与数组一起使用来取出数组。如果你想得到一个标量,简单的答案是使用dot
功能:
dot([1;2;3],[4;5;6])
当然,我可以这么说,但最好知道“为什么”,因为类型稳定性对于高性能代码来说是一个非常重要的想法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)