r - 如何在不使用应用或循环的情况下每 n 列矩阵插入一列

标签 r matrix vectorization

假设我有一个矩阵

M = diag(6)

我想插入

d = rep(5,6)

每第 3 列,所以输出是

M
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    0    0    0    0    0
[2,]    0    1    0    0    0    0
[3,]    0    0    1    0    0    0
[4,]    0    0    0    1    0    0
[5,]    0    0    0    0    1    0
[6,]    0    0    0    0    0    1
> d
[1] 5 5 5 5 5 5

输出:

     [,1] [,2] [,3] [,4]  [,5]   [,6]  [,7]   [,8]
[1,]    1    0    0    5    0       0    0      5
[2,]    0    1    0    5    0       0    0      5
[3,]    0    0    1    5    0       0    0      5
[4,]    0    0    0    5    1       0    0      5
[5,]    0    0    0    5    0       1    0      5
[6,]    0    0    0    5    0       0    1      5

最佳答案

我们通过更多列创建另一个 5 ('m1') 的矩阵,创建列索引(使用 setdiffseq)用“M”替换“m1”中的值

n <- 3
m1 <- matrix(5, ncol=ncol(M)+ncol(M)/n, nrow=nrow(M))
m1[,setdiff(1:ncol(m1),seq(4, ncol(m1), by=4))] <- M
m1
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,]    1    0    0    5    0    0    0    5
#[2,]    0    1    0    5    0    0    0    5
#[3,]    0    0    1    5    0    0    0    5
#[4,]    0    0    0    5    1    0    0    5
#[5,]    0    0    0    5    0    1    0    5
#[6,]    0    0    0    5    0    0    1    5

编辑:

我想与其创建另一个巨大的矩阵,不如cbind 额外的列然后排序

n1 <- ncol(M)/n
M1 <- matrix(5, nrow=nrow(M), ncol=n1)
M2 <- cbind(M, M1) 
n2 <- seq(4, ncol(M2), by=4)
M3 <- M2[,order(c(setdiff(seq_len(ncol(M2)), n2), n2))]
M3
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,]    1    0    0    5    0    0    0    5
#[2,]    0    1    0    5    0    0    0    5
#[3,]    0    0    1    5    0    0    0    5
#[4,]    0    0    0    5    1    0    0    5
#[5,]    0    0    0    5    0    1    0    5
#[6,]    0    0    0    5    0    0    1    5

基准

M <- diag(5000)
n <- 3
system.time({
n1 <- ncol(M)/n
M1 <- matrix(5, nrow=nrow(M), ncol=n1)
M2 <- cbind(M, M1) 
n2 <- seq(n+1, ncol(M2), by=n+1)
M3 <- M2[,order(c(setdiff(seq_len(ncol(M2)), n2), n2))]
})
#  user  system elapsed 
#  0.699   0.068   0.769 

n <- 3
system.time({
m1 <- matrix(5, ncol=ncol(M)+ncol(M)/n, nrow=nrow(M))
m1[,setdiff(1:ncol(m1),seq(n+1, ncol(m1), by=n+1))] <- M
})
#user  system elapsed 
#  0.722   0.061   0.785 

identical(m1, M3)
#[1] TRUE

关于r - 如何在不使用应用或循环的情况下每 n 列矩阵插入一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32793409/

相关文章:

r - 确定 R 中文件的年龄

java - 使用 Matrix 旋转位图的代码导致强制关闭

java - List<List<String>> 与 String[][]

r - 如何将多行合并转换为一列?

r - 从 R 中的列表导出单独的文本文件

r - 您遇到过的最大的 R 问题是什么?

C-将矩阵传递给没有非常量列值的函数

r - 矢量化()与应用()

algorithm - 向量化搜索包含给定子排列(带重复)的排列(带重复)

r - ggpubr/ggbarplot 中的错误栏突然合并(没有更改代码),我怎样才能再次将它们分开?