【发布时间】:2018-10-25 23:24:00
【问题描述】:
有没有一种简单的方法来检索 R 中非对称矩阵的上(或下)三角矩阵?对于对称矩阵,这可以使用mat[upper.tri(mat)] 来实现,但是对于非对称矩阵呢?这里上三角矩阵的定义是这样的:如果一个单元格超过其 1/2 的部分属于对角线分隔的矩阵的右上角,则该单元格属于上三角矩阵(例如,图中红色部分)。
【问题讨论】:
有没有一种简单的方法来检索 R 中非对称矩阵的上(或下)三角矩阵?对于对称矩阵,这可以使用mat[upper.tri(mat)] 来实现,但是对于非对称矩阵呢?这里上三角矩阵的定义是这样的:如果一个单元格超过其 1/2 的部分属于对角线分隔的矩阵的右上角,则该单元格属于上三角矩阵(例如,图中红色部分)。
【问题讨论】:
其实没那么难:
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
【讨论】:
col 和row,这让这变得容易多了。