是否有一种简单的方法来检索R中非对称矩阵的上三角矩阵(或下三角矩阵)?对于对称矩阵,可以使用mat[upper.tri(mat)]
来实现,但是对于非对称矩阵呢?在这里,上三角矩阵的定义是这样的:如果一个单元的部分大于1/2,则该单元属于用对角线界定的矩阵的右上角,则该单元属于上三角矩阵(例如,图中红色部分)。
答案 0 :(得分:5)
实际上并不难:
mat[nrow(mat) * (2 * col(mat) - 1) / (2 * ncol(mat)) - row(mat) > -1/2]
# [1] 4 7 10 11 13 14 15
想象一下,您的图片是R ^ 2空间的右上四分之一。也就是说,左下角对应于(0,0),依此类推。令nc
和nr
分别对应矩阵中的列数和行数。同样,让c
和r
对应于特定单元格的列和行。
很容易看出,对角线的等式在通常的表示法中是y = nr - nr / nc * x
。剩下的就是计算与每个(c,r)单元相对应的面积。该单元格的最高行位于y = nr - r + 1
级别,从x = c - 1
到x = c
。只要该面积大于1/2,我们就会将此单元格包括在答案中。这些区域的矩阵由
nrow(mat) * (2 * col(mat) - 1) / (2 * ncol(mat)) - row(mat) + 1
虽然矩阵不是正方形,但仍然有很多对称性,如果矩阵很大,则可以利用它并只计算25%〜的单元格的面积,但是我认为这里不是这种情况
由于这种对称性,下三角矩阵也很容易获得:
mat[nrow(mat) * (2 * col(mat) - 1) / (2 * ncol(mat)) - row(mat) < -1/2]
# [1] 1 2 3 5 6 9 12