1 元素数组到 Julia 中的标量
1-element Array to scalar in Julia
将行和列向量相乘,我期望结果是标量,但它是一维、1 元素数组:
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 给出一个数组。为了使其类型稳定,它必须始终给出一个数组。否则,编译器需要放置额外的代码来检查该变量是否为数组……在使用输出的每个地方!那么你应该使用 * with arrays 来获取数组。如果你想得到一个标量,简单的答案是使用 dot
函数:
dot([1;2;3],[4;5;6])
当然我可以这么说,但是知道 "why" 是件好事,因为类型稳定性对于高性能代码来说是一个非常重要的想法。
将行和列向量相乘,我期望结果是标量,但它是一维、1 元素数组:
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 给出一个数组。为了使其类型稳定,它必须始终给出一个数组。否则,编译器需要放置额外的代码来检查该变量是否为数组……在使用输出的每个地方!那么你应该使用 * with arrays 来获取数组。如果你想得到一个标量,简单的答案是使用 dot
函数:
dot([1;2;3],[4;5;6])
当然我可以这么说,但是知道 "why" 是件好事,因为类型稳定性对于高性能代码来说是一个非常重要的想法。