【问题标题】:Retrieve upper triangular elements of a matrix and order them by off-diagonal order检索矩阵的上三角元素并按非对角顺序对它们进行排序
【发布时间】:2018-03-16 08:40:35
【问题描述】:

我有一个矩阵(维度可能很大)并且想要检索所有上三角元素,然后按非对角线顺序对它们进行排序。例如,给定A = matrix(1:25, 5, 5),输出res

res = c( c(6,12,18,24), c(11,17,23), c(16,22), c(21) )
## i.e, res = c(offdiag_vect_1, offdiag_vect_2, offdiag_vect_3, offdiag_vect_4)

我知道可以通过A[upper.tri(A, diag=FALSE)] 检索上三角元素,但不知道如何以有效的方式以c(offdiag_vect_1, offdiag_vect_2, ..., offdiag_vect_(n-1)) 方式重新排序它们。

【问题讨论】:

  • 我的回答能解决你的问题吗?

标签: r matrix vector diagonal


【解决方案1】:

借用my other answer,可以用

split(A, col(A) - row(A))

获取所有对角线的列表。然后添加tail 只允许得到上面的,unlist 给出一个向量:

unlist(tail(split(A, col(A) - row(A)), ncol(A) - 1))
# 11 12 13 14 21 22 23 31 32  4 
#  6 12 18 24 11 17 23 16 22 21 

添加unname 可以去掉名字:

unname(unlist(tail(split(A, col(A) - row(A)), ncol(A) - 1)))
# [1]  6 12 18 24 11 17 23 16 22 21

对于一个大矩阵,它应该有助于不计算不相关的对角线。那么

unname(unlist(split(A[upper.tri(A)], (col(A) - row(A))[upper.tri(A)])))
# [1]  6 12 18 24 11 17 23 16 22 21

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2019-05-13
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多