R 如何用0填充向量和矩阵

R 如何用0填充向量和矩阵,r,matrix,vector,R,Matrix,Vector,我想获得一个长度为vec_length的向量,它通过添加0来扩展vec。这些0的位置由zero\u ind指定。也就是说,我想要一个如下所示的向量: vec <- c(22, -5) > mat [,1] [,2] [1,] 1 2 [2,] 2 3 母体 我现在有一个2x2矩阵,叫做mat,对应于vec 我想通过向量长度矩阵得到向量长度,其中,如果I或j是非零ind之一,则I,j位置上有0。也就是说,我想要一个如下所示的矩阵: vec <

我想获得一个长度为vec_length的向量,它通过添加0来扩展vec。这些0的位置由zero\u ind指定。也就是说,我想要一个如下所示的向量:

vec <- c(22, -5)
> mat
     [,1] [,2]
[1,]    1    2
[2,]    2    3
母体

我现在有一个2x2矩阵,叫做mat,对应于vec

我想通过向量长度矩阵得到向量长度,其中,如果I或j是非零ind之一,则I,j位置上有0。也就是说,我想要一个如下所示的矩阵:

vec <- c(22, -5)
> mat
     [,1] [,2]
[1,]    1    2
[2,]    2    3
一个例子:

> expected_mat
     [,1] [,2] [,3] [,4]
[1,]    1    0    2    0
[2,]    0    0    0    0
[3,]    2    0    3    0
[4,]    0    0    0    0
一个例子:

> expected_mat
     [,1] [,2] [,3] [,4]
[1,]    1    0    2    0
[2,]    0    0    0    0
[3,]    2    0    3    0
[4,]    0    0    0    0
对于向量:

# Input data
vec_inp <- c(22, -5)
mat_inp <- matrix(c(1, 2, 2, 3), ncol = 2)


# Vector case
update_vec <- function(inp, len, nzi) {
  replace(x = vector(mode = 'double', length = len), list = nzi, values = inp)
}
update_vec(vec_inp, vec_length, nonzero_ind)
# [1] 22  0 -5  0

# Matrix case, work column by column
mat_out <- matrix(vector(mode = 'double', length = vec_length^2), ncol = vec_length)
for (i in seq_along(nonzero_ind)) {
  mat_out[, nonzero_ind[i]] <- update_vec(mat_inp[, i], vec_length, nonzero_ind)
}
mat_out
#      [,1] [,2] [,3] [,4]
# [1,]    1    0    2    0
# [2,]    0    0    0    0
# [3,]    2    0    3    0
# [4,]    0    0    0    0
以及矩阵:

"[<-"(numeric(vec_length), nonzero_ind, vec)
#[1] 22  0 -5  0

"[<-"(numeric(vec_length), seq_len(vec_length)[-zero_ind], vec)
#[1] 22  0 -5  0

x <- numeric(vec_length)
(x[nonzero_ind] <- vec)
#[1] 22  0 -5  0

x <- numeric(vec_length)
(x[-zero_ind] <- vec)
#[1] 22  0 -5  0

对于向量:

# Input data
vec_inp <- c(22, -5)
mat_inp <- matrix(c(1, 2, 2, 3), ncol = 2)


# Vector case
update_vec <- function(inp, len, nzi) {
  replace(x = vector(mode = 'double', length = len), list = nzi, values = inp)
}
update_vec(vec_inp, vec_length, nonzero_ind)
# [1] 22  0 -5  0

# Matrix case, work column by column
mat_out <- matrix(vector(mode = 'double', length = vec_length^2), ncol = vec_length)
for (i in seq_along(nonzero_ind)) {
  mat_out[, nonzero_ind[i]] <- update_vec(mat_inp[, i], vec_length, nonzero_ind)
}
mat_out
#      [,1] [,2] [,3] [,4]
# [1,]    1    0    2    0
# [2,]    0    0    0    0
# [3,]    2    0    3    0
# [4,]    0    0    0    0
以及矩阵:

"[<-"(numeric(vec_length), nonzero_ind, vec)
#[1] 22  0 -5  0

"[<-"(numeric(vec_length), seq_len(vec_length)[-zero_ind], vec)
#[1] 22  0 -5  0

x <- numeric(vec_length)
(x[nonzero_ind] <- vec)
#[1] 22  0 -5  0

x <- numeric(vec_length)
(x[-zero_ind] <- vec)
#[1] 22  0 -5  0

也许你可以试试下面的克罗内克

mat_out <- matrix(0, vec_length, vec_length)
mat_out[nonzero_ind, nonzero_ind] <- mat
mat_out
#     [,1] [,2] [,3] [,4]
#[1,]    1    0    2    0
#[2,]    0    0    0    0
#[3,]    2    0    3    0
#[4,]    0    0    0    0
也许你可以试试下面的克罗内克

mat_out <- matrix(0, vec_length, vec_length)
mat_out[nonzero_ind, nonzero_ind] <- mat
mat_out
#     [,1] [,2] [,3] [,4]
#[1,]    1    0    2    0
#[2,]    0    0    0    0
#[3,]    2    0    3    0
#[4,]    0    0    0    0
你可以用[你可以用]得到向量[[[