矩阵用一个填充零行

问题描述 投票:2回答:4

我有一个邻接矩阵A:

    [1] [2] [3]
[1]  1   0   1
[2]  0   0   0
[3]  0   0   0

我想要一个新的矩阵B,在所有行中只填充一个,只有零,所以B:

    [1] [2] [3]
[1]  0   0   0
[2]  1   1   1
[3]  1   1   1

我怎么能这样做我R

r matrix linear-algebra
4个回答
3
投票

由于邻接矩阵是非负的,你可以测试零rowSums

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

2
投票

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

t(apply(A, 1, function(x){ifelse(x != sum(x), 0, 1)}))

1
投票

显示的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)

0
投票

其他方式

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
© www.soinside.com 2019 - 2024. All rights reserved.