从非对称矩阵中获取上三角矩阵

7
有没有一种简单的方法在R中检索非对称矩阵的上(或下)三角矩阵?对于对称矩阵,可以使用mat[upper.tri(mat)]来实现,但是对于非对称矩阵呢?这里上三角矩阵的定义是这样的:如果一个单元格的超过1/2的部分属于由对角线限定的矩阵的右上角,则该单元格属于上三角矩阵(例如图中的红色部分)。
谢谢。 enter image description here
1个回答

6
实际上并不难:
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 的位置,横坐标范围从 c - 1 到 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

1
完美,正是我要发布的内容 - 只是我不知道 colrow,这使得它变得更容易了。 - Konrad Rudolph
非常聪明! :-) - nghauran
不错的解决方案! - yliueagle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接