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