2017-02-20 31 views
4

如果我做为什么Matrix上的'sum'返回矩阵,而不是Vector?

mat = rand(8,8) 
sum(mat, 1) 

返回类型是一个单列矩阵,而sum(mat, 2)给出了一列的矩阵。这令我感到惊讶,因为singleton维度通常是0.5,所以我期望这两种操作的返回类型都是Vector。为什么singleton维度不会在这里下降?

我可能认为这是为了保留方向(例如sum(mat, 1)是一个行向量),但行为在0.6上是一样的,它有明确的一维RowVectors,所以这看起来不是一个解释。

谢谢!

回答

4

是的,像sum这样的缩小保留了数组的维数。这是故意的,因为它可以将结果广播回原始数组。这意味着,你可以,例如,规范数组的列与./

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 

在二维情况下,可能能够通过RowVector s为单位进行处理,这种做法并没有推广到更高的层面。

也就是说,还有其他情况下,放置尺寸be similarly useful。这是一个open design question on the issue tracker

+0

不错,谢谢!我确实想过这个广播,但并不是说它不会推广到更高的尺寸。我看到了这个问题,所以,谢谢! 这是因为我在矩阵的行和列总和上定义了函数,并且将输入参数定义为“Vector”似乎很自然,但这意味着我必须调用,例如, 'myfunc(vec(sum(mat,1)))',看起来很笨拙。但让参数成为矩阵似乎可能会导致问题。不过,我想我可以用调度来解决这个问题。 –

+1

通常不需要严格限制参数类型。除了'Vector'之外,你几乎可以肯定地使用'AbstractVector' - 它将包含视图和重构的矢量以及许多其他自定义矢量类型。在所有维度上甚至比“Any”更普遍。当然,传递一些无意义的东西可能会比你想象的要晚一些,但它可以让某个人传递一些[看起来像鸭子]的东西(https://en.wikipedia.org/wiki/Duck_typing#In_Julia)和它仍然会嘎嘎响。 –

+0

谢谢,是的,我同意通常不需要限制函数参数(和重要的内部类型)中的类型,我喜欢这个原则!另外,我确实使用了AbstractVector(对不起)。但是,在这种情况下,行矩阵和列矩阵与Vector有不同的行为(例如,当传递给像'size'这样的函数时),如果我忽略了维度,它可能不会导致意外的错误?最后,我沿着'f(x :: AbstractMatrix)= f(vec(x))做了一些事情; F(X :: AbstractVector)...' –

相关问题