我正在尝试在特定位置添加行到矩阵,这些位置包含在向量中。下面的模式显示了输入和预期结果。我尝试使用“ for”循环,但无法正常工作。任何建议都会有所帮助。
源矩阵(6x3)
(1) 1 2 3
(2) 4 5 6
(3) 7 8 9
(4) 6 9 2
(5) 3 6 1
(6) 2 2 7
Run Code Online (Sandbox Code Playgroud)
位置向量(指示源矩阵中将包含零的行)
[2, 5, 6]
Run Code Online (Sandbox Code Playgroud)
结果矩阵(6 + length.vector x 3)
(1) 1 2 3
(2*)0 0 0
(3) 4 5 6
(4) 7 8 9
(5*)0 0 0
(6*)0 0 0
(7) 6 9 2
(8) 3 6 1
(9) 2 2 7
Run Code Online (Sandbox Code Playgroud)
mat <- matrix(1:18,6)
vec <- c(2, 5, 6)
# New matrix 'new_mat' with all zeros,
# No. of rows = original matrix rows + number new rows to be added
new_mat <- matrix(0,nrow=9,ncol=3)
# 'new_mat' rows getting filled with `mat` values
new_mat[-vec,] <- mat
new_mat
# [,1] [,2] [,3]
# [1,] 1 7 13
# [2,] 0 0 0
# [3,] 2 8 14
# [4,] 3 9 15
# [5,] 0 0 0
# [6,] 0 0 0
# [7,] 4 10 16
# [8,] 5 11 17
# [9,] 6 12 18
Run Code Online (Sandbox Code Playgroud)
这是一种方法:
## inputs
m <- matrix(c(1,2,3,4,5,6,7,8,9,6,9,2,3,6,1,2,2,7),ncol=3L,byrow=T);
i <- c(2L,5L,6L);
## solution
ris <- integer(nrow(m)+length(i)); ris[i] <- nrow(m)+1L; ris[-i] <- seq_len(nrow(m));
rbind(m,0)[ris,];
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 0 0 0
## [3,] 4 5 6
## [4,] 7 8 9
## [5,] 0 0 0
## [6,] 0 0 0
## [7,] 6 9 2
## [8,] 3 6 1
## [9,] 2 2 7
Run Code Online (Sandbox Code Playgroud)
它的工作原理是首先计算行索引向量ris。首先将向量分配到所需的大小,即原始矩阵的行数nrow(m)加上要插入的行数,即length(i)。然后将插入索引分配给刚好超出原始矩阵行数的索引nrow(m)+1L,将非插入索引分配给序列seq_len(nrow(m))。我们可以通过使用ris复合矩阵进行索引来获得所需的输出,该复合矩阵由原始矩阵与一行零(或希望在每个插入索引处插入的任何值集)进行行绑定组成。