如何用 0 填充向量和矩阵

时间:2021-01-26 15:16:38

标签: r matrix vector

vec_length <- 4
nonzero_ind <- c(1, 3)
zero_ind <- c(2, 4)

矢量:

我目前有一个名为 vec 的向量,其中包含 2 个元素。

vec <- c(22, -5)

我想获得一个长度为 vec_length 的向量,它通过添加 0 来扩展 vec。这些 0 的位置由 zero_ind 指定。也就是说,我想要一个看起来像这样的向量:

> expanded_vec
[1] 22  0 -5  0

矩阵

我目前有一个名为 mat 的 2x2 矩阵,它对应于 vec

> mat
     [,1] [,2]
[1,]    1    2
[2,]    2    3

如果 i OR j 是 vec_length 之一,我想通过 vec_length 矩阵获得 nonzero_ind,其中第 (i,j) 个位置为 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

3 个答案:

答案 0 :(得分:2)

对于向量:

"[<-"(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

和矩阵:

i <- "[<-"(rep(NA,vec_length), nonzero_ind, seq_along(nonzero_ind))
mat <- mat[i, i]
mat[is.na(mat)] <- 0
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

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

答案 1 :(得分:1)

也许你可以像下面这样尝试kronecker

> kronecker(vec,c(1,0))
[1] 22  0 -5  0

> kronecker(mat,matrix(c(1,0,0,0),nrow(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

答案 2 :(得分: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
相关问题