R中没有循环的矩阵生成

Mob*_*oom 0 arrays r matrix

我正在尝试在 R 中创建以下类型的矩阵:行数等于 n(提供);在第 i 行中,对于所有 i=1:n,在位置 n(i-1)+1 到 n(i-1)+n(含)处的1元素是 ,所有其他元素都是0。例如,如果 n=3,矩阵看起来像

1 1 1 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 1 1 1
Run Code Online (Sandbox Code Playgroud)

或者对于 n=4:

1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

有没有办法在 R 中构造这个矩阵,对于一般 n,而不使用for循环(或任何其他类型的循环最好)?

最简单/最有效的方法(在基础 R 中)将是理想的。

Jan*_*Jan 5

解决方案 1:diag返回矩阵的对角线。重复each元素 3 次并(重新)将其强制转换为矩阵:

matrix(rep(diag(3), each=3), nrow=3, byrow=TRUE)
#>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#> [1,]    1    1    1    0    0    0    0    0    0
#> [2,]    0    0    0    1    1    1    0    0    0
#> [3,]    0    0    0    0    0    0    1    1    1
Run Code Online (Sandbox Code Playgroud)

解决方案2:table将两个向量解释为因子并计算它们的水平组合。由于每个组合只存在一次,你会得到相同的结果:

table(rep(1:3, each = 3), 1:9)
#>    
#>     1 2 3 4 5 6 7 8 9
#>   1 1 1 1 0 0 0 0 0 0
#>   2 0 0 0 1 1 1 0 0 0
#>   3 0 0 0 0 0 0 1 1 1
Run Code Online (Sandbox Code Playgroud)

reprex 包(v1.0.0)于2021年 2 月 21 日创建