【问题标题】:why does `sum` on a Matrix return Matrix, not Vector?为什么矩阵上的“和”返回矩阵,而不是向量?
【发布时间】:2017-02-21 03:59:22
【问题描述】:

如果我这样做

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

返回类型是单行矩阵,而sum(mat, 2) 给出单列矩阵。这让我感到惊讶,因为单例维度通常会下降到 0.5,所以我希望这两个操作的返回类型都是 Vector。为什么这里没有丢弃单例维度?

我可能认为这是为了保持方向(例如,sum(mat, 1) 是行向量),但在 0.6 上的行为是相同的,它具有明确的一维 RowVectors,所以这似乎不是解释。

谢谢!

【问题讨论】:

    标签: julia


    【解决方案1】:

    是的,像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
    

    虽然RowVectors 可能能够处理二维情况,但这种方法并不能推广到更高的维度。

    也就是说,在其他情况下会删除尺寸be similarly useful。这是open design question on the issue tracker

    【讨论】:

    • 很好,谢谢!我确实考虑过广播,但并不是说它不会推广到更高的维度。看到问题了,谢谢!这是因为我在矩阵的行和列和上定义函数,将输入参数定义为Vectors 似乎很自然,但这意味着我必须调用,例如myfunc(vec(sum(mat,1))),看起来很笨拙。但是让参数成为矩阵似乎可能会导致问题。不过,我想我可以通过调度来解决这个问题。
    • 通常不需要如此严格地限制参数类型。除了Vector,您几乎可以肯定使用AbstractVector — 这将包括视图和重新调整的向量以及许多其他自定义向量类型。在所有维度甚至可能到Any。当然,传递一些无意义的东西可能会比你喜欢的晚一点,但它可以让别人传递给你looks like a duck 的东西,它仍然会嘎嘎作响。
    • 谢谢,是的,我同意通常不需要限制函数参数中的类型(以及重要的内部类型),我喜欢这个原则!另外,我确实使用了 AbstractVector (抱歉不清楚)。但是,在这种情况下,行矩阵和列矩阵与向量具有不同的行为(例如,当传递给诸如size 之类的函数时),所以如果我忽略维数,它可能不会导致意外错误吗?最后我做了一些事情f(x::AbstractMatrix) = f(vec(x)); f(x::AbstractVector)...
    猜你喜欢
    • 2022-10-14
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2015-07-09
    • 2021-05-11
    • 2017-04-14
    • 2020-04-08
    相关资源
    最近更新 更多