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