R 矩阵用一填充零行

R 矩阵用一填充零行,r,matrix,linear-algebra,R,Matrix,Linear Algebra,我有一个邻接矩阵A: [1] [2] [3] [1] 1 0 1 [2] 0 0 0 [3] 0 0 0 我想要一个新的矩阵B,所有行中只有一个矩阵B,所以B: [1] [2] [3] [1] 0 0 0 [2] 1 1 1 [3] 1 1 1 我怎样才能做到这一点呢?apply()在这里很有用。试一试 t(apply(A, 1, function(x){ifelse(x != sum(x), 0, 1)})) 另

我有一个邻接矩阵A:

    [1] [2] [3]
[1]  1   0   1
[2]  0   0   0
[3]  0   0   0
我想要一个新的矩阵B,所有行中只有一个矩阵B,所以B:

    [1] [2] [3]
[1]  0   0   0
[2]  1   1   1
[3]  1   1   1
我怎样才能做到这一点呢?

apply()
在这里很有用。试一试

t(apply(A, 1, function(x){ifelse(x != sum(x), 0, 1)}))
另一种方式

m <- matrix( c(1, 0, 1, 0, 0, 0, 0, 0, 0), nrow = 3, byrow = T )
> m
     [,1] [,2] [,3]
[1,]    1    0    1
[2,]    0    0    0
[3,]    0    0    0

m <- matrix(rep(ifelse(rowSums(m) == 0, 1, 0), dim(m)[1]), nrow =  dim(m)[1])
> m
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    1    1    1
[3,]    1    1    1
m
[,1] [,2] [,3]
[1,]    1    0    1
[2,]    0    0    0
[3,]    0    0    0
m m
[,1] [,2] [,3]
[1,]    0    0    0
[2,]    1    1    1
[3,]    1    1    1

由于邻接矩阵是非负的,所以您可以只测试零
行和:

A <- matrix(c(1, 0, 1, 
              0, 0, 0, 
              0, 0, 0), byrow = TRUE, nrow = 3)

B <- A * 0  # 0-matrix same dimensions as A
B[rowSums(A) == 0, ] <- 1

A显示的
apply
返回一个向量,该向量每行
A
返回一个元素,如果该行全为零,则该向量的值为TRUE,否则返回FALSE。使用循环将该向量分配给
A
,使A的每一列都充满该向量。这样的赋值还具有将FALSE和TRUE转换为0和1的效果。这个表达式很紧凑,看起来比较容易理解,并且不使用任何包

replace(A, TRUE, apply(A == 0, 1, all))
给予:

     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    1    1    1
[3,]    1    1    1
这种变化甚至更短,但有点棘手:

replace(A, TRUE, apply(!A, 1, all))
注 可复制形式的输入
A

A <- matrix(c(1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L), 3)

A您应该指定将矩阵更改为所需格式的规则。请尝试
i1我喜欢x!=求和(x)部分!