0

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

例如我想要:

 [1 4 5
  2 3 5
  3 9 8]

成为:

 [1 0 0
  0 3 0
  0 0 8]

这可能吗?对不起,我在这方面完全是个菜鸟..

4

6 回答 6

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
于 2013-05-23T06:14:15.303 回答
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

方法一:

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

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

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

---

方法二:

一种完全不同的单线,也有效-

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

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

于 2013-05-23T07:57:27.537 回答
1

对于 nxm 的矩阵

for i to n
    for j to m
        if i != j
            matrix[i][j] = 0;
于 2013-05-23T04:07:09.993 回答
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
于 2013-05-23T05:34:43.593 回答
0

I'm transferring my answer from your second post on this topic.

You can use the following to compute a logical matrix which describes the non-diagonal entries of a n×n matrix:

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

Applied to your example:

> 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

I also like the triangle approach by @e4e5f4. That might be a bit faster than this code here, but this code here might be easier to adapt to different situations. So it's good to know this one, even if that one might be preferrable for your current application.

于 2013-05-23T06:27:48.913 回答
0

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

于 2013-05-23T04:07:30.890 回答