更具体地说,我希望除了对角线之外的所有元素(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]
这可能吗?对不起,我这是一个完整的菜鸟..
答案 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。这可能比这里的代码快一点,但这里的代码可能更容易适应不同的情况。因此,了解这一个是很好的,即使这个可能对您当前的应用程序更有利。