将行向量和列向量相乘,我期望结果是标量,但它是一维、单元素数组:
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”,以防万一您的类型错误。因此,通过确保类型稳定性,编译器可以提前知道类型是什么,并进行更多优化。这是 performance tips 之一。事实上,由于多重调度和类型稳定性,Julia 很快并达到了 C 速度,因此应该受到尊重。
Array * Array 给出一个数组。为了使其类型稳定,它必须始终给出一个数组。否则,编译器需要在使用输出的每个地方放置额外的代码来检查该变量是否是数组!因此,您应该将 * 与数组一起使用来取出数组。如果您想得到标量,简单的答案是使用 dot
函数:
dot([1;2;3],[4;5;6])
当然我可以这么说,但最好知道“为什么”,因为类型稳定性对于高性能代码来说是一个非常重要的想法。
关于vector - Julia 中的 1 元素数组到标量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39079428/