矩阵用一个填充零行

时间:2017-12-23 14:08:23

标签: r matrix linear-algebra

我有一个邻接矩阵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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

t(apply(A, 1, function(x){ifelse(x != sum(x), 0, 1)})) 在这里很有用。尝试

@property
def title_str(self) -> str:
    return self._title_str

@title_str.setter
def title_str(self, i_new_title: str):
    self._title_str = i_new_title
    self._update(db.Schema.PhrasesTable.Cols.title, i_new_title)

答案 2 :(得分: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)

答案 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