【问题标题】:Selecting specific elements from a matrix all at once一次从矩阵中选择特定元素
【发布时间】:2012-08-16 19:05:47
【问题描述】:

有没有一种方法可以一次从矩阵中选择一堆预先指定的元素?具体来说,假设我有以下矩阵:

      58        59        60       62        63        64
58  0.000000  3.772139  6.367721 8.978718 12.197210 13.401126
59  3.772139  0.000000  3.755554 5.935946  9.592700 11.664533
60  6.367721  3.755554  0.000000 5.999409  9.324764 11.991269
62  8.978718  5.935946  5.999409 0.000000  3.810169  6.762802
63 12.197210  9.592700  9.324764 3.810169  0.000000  3.796884
64 13.401126 11.664533 11.991269 6.762802  3.796884  0.000000

我想选择单元格 [1,2]、[2,3]、[3,4]、[4,5]、[5,6]。我意识到我可以通过索引引用它们,在这种情况下我可以运行:

mymatrix[c(2,9,16,23,30)]

不过,这点后面看代码就不是很清楚了。有没有办法一次输入实际的(行、列)引用?

【问题讨论】:

  • 类似as.vector(mymatrix[c(1, 2, 3, 4, 5), c(2, 3, 5, 6)]) (mymatrix[row, column])

标签: r matrix


【解决方案1】:

可以使用 2 个列矩阵进行索引。将这些行号和列号转换为有效的 R 对象(而不是 Matlab 样式的表达式)后:

> idxs <- gsub("\\]",")", gsub("\\[", "c(",  "[1,2], [2,3], [3,4], [4,5] ,[5,6]") )
# I edited the string value that idxs returned:
> midx <- rbind( c(1,2), c(2,3), c(3,4), c(4,5) ,c(5,6) )
> mat <-  matrix(scan(), nrow=6)  
1:  0.000000  3.772139  6.367721 8.978718 12.197210 13.401126
7:   3.772139  0.000000  3.755554 5.935946  9.592700 11.664533
13:   6.367721  3.755554  0.000000 5.999409  9.324764 11.991269
19:   8.978718  5.935946  5.999409 0.000000  3.810169  6.762802
25:  12.197210  9.592700  9.324764 3.810169  0.000000  3.796884
31:  13.401126 11.664533 11.991269 6.762802  3.796884  0.000000
37: 
Read 36 items
> mat[midx]
[1] 3.772139 3.755554 5.999409 3.810169 3.796884

如果您的目标是索引可以更普遍地完成的超对角线:

> mat[col(mat)==row(mat)+1]
[1] 3.772139 3.755554 5.999409 3.810169 3.796884

【讨论】:

  • 我在想他想要解决任意一组 x-y 对。推测:您使用简化矩阵的 diag() 方法可能比我的 row==col+1 方法更快。
  • 我对一般案例很感兴趣,以供自己启迪。但是,对于我正在查看的问题,diag 方法效果很好。谢谢你们!
【解决方案2】:

针对您的具体情况的解决方案是选择子矩阵并使用diag 函数:

R> diag(x[-ncol(x),-1])
[1] 3.772139 3.755554 5.999409 3.810169 3.796884

【讨论】:

  • 发现它比索引更“可读”,但我确信我是少数。
  • 是的,@joran,一开始我没明白,但现在在被鼓励再看一遍后,我明白了发生了什么。可能相当有效
【解决方案3】:

与上面发布的类似的解决方案,但处理具有行向量和列向量的情况(这是我遇到此线程时的问题)如下:

> rows <- c(1,2,3,4,5)
> cols <- c(2,3,4,5,6)
> call <- cbind(rows,cols)
> 
> mat[call]
[1] 3.772139 3.755554 5.999409 3.810169 3.796884

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多