检索矩阵的上三角形元素并按非对角线顺序排序

时间:2018-03-16 08:40:36

标签: r matrix vector diagonal

我有一个矩阵(尺寸可能很大),想要检索所有上三角形元素,然后按非对角线顺序排序。例如,给定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))方式重新排序它们。

1 个答案:

答案 0 :(得分: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