如何替换矩阵中的非对角元素?

时间:2013-05-23 04:02:26

标签: r replace diagonal

更具体地说,我希望除了对角线之外的所有元素(X_11,X_22,X_33,...,X_jj)都为零。

E.g。我想要:

 [1 4 5
  2 3 5
  3 9 8]

是:

 [1 0 0
  0 3 0
  0 0 8]

这可能吗?对不起,我这是一个完整的菜鸟..

6 个答案:

答案 0 :(得分:2)

最简单的方法是创建一个填充0的新矩阵,然后用旧矩阵的对角线替换它的对角线。

所以如果你有:

m <- cbind(c(1,2,3), c(4,3,9), c(5, 5, 8))  # The original matrix

diagonal <- diag(m)
m <- matrix(0, nrow(m), ncol(m))  # Overwrite the old matrix
diag(m) <- diagonal

答案 1 :(得分:2)

这是一个简单的单线。首先,获取数据:

> (a <- matrix(scan(),nr=3,byrow=TRUE))
1: 1 4 5 2 3 5 3 9 8
10: 
Read 9 items
     [,1] [,2] [,3]
[1,]    1    4    5
[2,]    2    3    5
[3,]    3    9    8

方法1:

> diag(diag(a))
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    3    0
[3,]    0    0    8

问题是,如果它的参数是一个矩阵,diag 提取对角线......但如果参数是一个向量,它是一个创建的函数一个对角矩阵。所以只需使用它两次。 (实际上diag四个不同用途,具体取决于您提供的内容,但其中两个案例非常相似。)请参阅?diag

如果你的矩阵很大,这不太可能是最有效的方法,但对于中等大小的情况,这就是我的方式。

---

方法2:

完全不同的单线也可以使用 -

ifelse(row(a)==col(a),a,0)

两者在方形矩阵上的工作方式相同。但是它们在非方形矩阵上有不同的结果 - 第一个返回一个方形矩阵(尺寸是两个原始尺寸中较小的一个),而第二个返回一个与其参数形状相同的对象;根据具体情况,这可能很有用。

答案 2 :(得分:1)

对于n x m

的矩阵
for i to n
    for j to m
        if i != j
            matrix[i][j] = 0;

答案 3 :(得分:1)

如果m是您的矩阵,请尝试:

m = matrix(c(1,4,5,2,3,5,3,9,8),3,3)
m[upper.tri(m) | lower.tri(m)] = 0

m

##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    3    0
## [3,]    0    0    8

答案 4 :(得分:0)

它只是依赖于你正在处理的矩阵的大小,假设你有一个 nxn 矩阵,那么对角线就会出现在这些地方0,n + 1,2(n +1),3(n + 1),...如果您提到的矩阵不是多维的并且是线性的!所以只需编写一个for循环即可。

答案 5 :(得分:0)

我正在从my answer转移your second post on this topic

您可以使用以下内容计算逻辑矩阵,该矩阵描述n×n矩阵的非对角线条目:

outer(1:n, 1:n, function(i,j) i!=j)

应用于您的示例:

> m <- matrix(c(1,2,3,4,3,9,5,5,8),ncol=3)
> m
     [,1] [,2] [,3]
[1,]    1    4    5
[2,]    2    3    5
[3,]    3    9    8
> m[outer(1:3, 1:3, function(i,j) i!=j)] <- 0
> m
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    3    0
[3,]    0    0    8

我也喜欢triangle approach @e4e5f4。这可能比这里的代码快一点,但这里的代码可能更容易适应不同的情况。因此,了解这一个是很好的,即使这个可能对您当前的应用程序更有利。