乘以行和列向量,我希望结果是标量,但它是一维的1元素数组:
julia> [1 2 3] * [4; 5; 6]
1-element Array{Int64,1}:
32
问题1:这背后的理由是什么?
问题2:接受这个作为Julia的怪癖,我想将1元素数组转换为标量。使用[1]的第一个元素是一个选项,但不是很可读。这样做的特殊方法是什么?
答案 0 :(得分:6)
可以对每个表达式执行操作,因此您可以使用
([1 2 3] * [4; 5; 6])[1]
获得第一个(并且唯一的值)。
这有一个主要的性能原因:类型稳定性。基本上,在编译语言中,如果不进行大量转换,则无法更改类型。 Julia有点聪明,但是如果你做了很多转换,那么你的代码将会变慢,因为编译器必须保留很多" kruft"以防你有错误的类型。因此,通过确保类型稳定性,编译器可以预先知道类型是什么,并进行更多优化。这是performance tips之一。事实上,朱莉娅速度快,达到C速度,因为多次调度和类型稳定,所以应该受到尊重。
Array * Array给出一个数组。为了使其类型稳定,它必须总是给出一个数组。否则,编译器需要在每个使用输出的地方放置额外的代码来检查该变量是否为数组!那么你应该使用* with arrays来获取数组。如果你想得到一个标量,那么简单的答案就是使用dot
函数:
dot([1;2;3],[4;5;6])
我当然可以这样说,但知道"为什么"因为类型稳定性是高性能代码的重要思想。