【问题标题】:Indexing a matrix by a vector [duplicate]通过向量索引矩阵[重复]
【发布时间】:2016-05-07 23:20:50
【问题描述】:
m = matrix(1:10, nrow = 5, ncol = 2)
y = c(1,2,2,1,1)

我想要一个向量v,其ith 元素是m[i,y[i]]

我以为m[,y] 会这样做,但这显然是错误的。

【问题讨论】:

标签: r


【解决方案1】:

您可以使用cbind() 创建用于索引的矩阵。

m[cbind(seq_along(y), y)]
# [1] 1 7 8 4 5

【讨论】:

    【解决方案2】:

    另外,因为在这种特殊情况下,我们选择行 1, 2, ..., nrow(m)

    diag(m[, y])
    # [1] 1 7 8 4 5
    

    【讨论】:

    • 这是非常低效的。让y = sample(c(1,2), 10^6, replace=TRUE)m = matrix(1:(2*10^6), nrow=10^6, ncol=2)system.time(m[cbind(seq_along(y), y)] 在不到一秒的时间内返回正确的结果。尝试用上面的代码做同样的例子。
    • @rawr - 在毫秒内争论很烦人,但在这种情况下,diag 几乎扼杀了运行此函数的能力。 Joseph 的 10^5 示例的矩阵索引在我古老的双核机器上运行时间为 0.007 秒。 diag 失败并显示“...无法分配大小为 37.3Gb 的向量”。很少有人拥有 37Gb 的内存。
    • 虽然我同意你的 cmets,但并不是每个人都在使用大小为 10^5 的矩阵,而且了解另一种方法也没有什么坏处。但显然它确实伤害到足以让某人投反对票的程度解决问题的答案。
    • @rawr - 实际上这是一个完全有效的答案,实际上值得一票。我已经纠正了谁反对它。
    • @Julius,我刚刚重读了我的第一条评论……真是个混蛋(当然是我)!!!我往往会不时被效率所蒙蔽,这使我无法像你所说的那样(意识到)其他方法。事实上,当我读到这个问题时,我已经深深地沉浸在rbenchmark 库中(我真的需要放松一下)。我想起了那句话过早的优化是万恶之源。 +1 带来一些新的视角。
    猜你喜欢
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    相关资源
    最近更新 更多