Julia 为什么矩阵上的'sum'返回矩阵而不是向量?
如果我这样做 返回类型是一个单行矩阵,而Julia 为什么矩阵上的'sum'返回矩阵而不是向量?,julia,Julia,如果我这样做 返回类型是一个单行矩阵,而sum(mat,2)给出了一个单列矩阵。这让我感到惊讶,因为单例维度通常在0.5中下降,所以我希望这两个操作的返回类型都是向量。为什么这里不删除单例维度 我可能认为这是为了保持方向(例如,sum(mat,1)是一个行向量),但在0.6上的行为是相同的,它有明确的一维行向量,因此这似乎不是一个解释 谢谢 是的,像sum这样的缩减保留了数组的维数。这是有意的,因为它允许跨原始阵列广播结果。例如,这意味着您可以使用/规范化数组的列: mat = rand(8,8
sum(mat,2)
给出了一个单列矩阵。这让我感到惊讶,因为单例维度通常在0.5中下降,所以我希望这两个操作的返回类型都是向量。为什么这里不删除单例维度
我可能认为这是为了保持方向(例如,sum(mat,1)
是一个行向量),但在0.6上的行为是相同的,它有明确的一维行向量,因此这似乎不是一个解释
谢谢 是的,像
sum
这样的缩减保留了数组的维数。这是有意的,因为它允许跨原始阵列广播结果。例如,这意味着您可以使用/
规范化数组的列:
mat = rand(8,8)
sum(mat, 1)
虽然二维情况可能可以由RowVector
s处理,但这种方法不能推广到更高的维度
也就是说,在其他情况下,删除维度可能会导致错误。这是一个很好的例子。很好,谢谢!我确实想过广播,但并不是说它不能推广到更高的维度。我明白了,所以,谢谢!这是因为我在矩阵的行和列和上定义函数,将输入参数定义为
Vector
s似乎很自然,但这意味着我必须调用,例如myfunc(vec(sum(mat,1)))
,这看起来很笨拙。但是允许参数是矩阵似乎会引起问题。不过,我想我可以通过分派来解决这个问题。通常没有必要如此严格地限制参数类型。除了Vector
,您几乎可以肯定地使用AbstractVector
——这将包括视图和重新造型的向量以及许多其他自定义向量类型。在所有维度上,甚至在Any
上,比这更宽的范围是很常见的。当然,传递一些无意义的东西可能会比你希望的晚一点出错,但它可以让别人传递一些东西给你,而且它仍然会嘎嘎作响。谢谢,是的,我同意这一点,通常不需要在函数参数中限制类型(以及重要的内部类型),我喜欢这个原则!此外,我也使用了AbstractVector(很抱歉不清楚)。但是,在这种情况下,行矩阵和列矩阵的行为与向量不同(例如,当传递给函数时,如size
),因此如果忽略维度,是否不会导致意外错误?最后,我做了一些事情,包括f(x::AbstractMatrix)=f(vec(x));f(x::AbstractVector).
julia> A = rand(1:100, 4, 3)
4×3 Array{Int64,2}:
94 50 32
46 15 78
34 29 41
79 22 58
julia> A ./ sum(A, 1)
4×3 Array{Float64,2}:
0.371542 0.431034 0.15311
0.181818 0.12931 0.373206
0.134387 0.25 0.196172
0.312253 0.189655 0.277512