【发布时间】:2019-09-09 23:14:56
【问题描述】:
我想构造一个如下所示的矩阵:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
[1,] 1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 1 0 0 -1 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 1 0 0 -1 0 0 0 0 0 0
[4,] 0 0 0 0 0 0 0 0 0 1 0 0 -1 0 0 0
[5,] 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -1
我正在考虑的方式,虽然有点不太好,是创建一个包含一个模式的向量,该模式将重复填充,逐行,矩阵
pattern <- c(1,rep(0,2),-1,rep(0,15)) #creating the pattern
matrix(rep(pattern, 5), 5, 16, byrow = TRUE) #filling a matrix per row with repetitions of the pattern
#Returns:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16]
[1,] 1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 1 0 0 -1 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 1 0 0 -1 0 0 0 0 0 0
[4,] 0 0 0 0 0 0 0 0 0 1 0 0 -1 0 0 0
[5,] 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -1
Warning message:
In matrix(rep(pattern, 5), 5, 16, byrow = TRUE) :
data length [95] is not a sub-multiple or multiple of the number of columns [16]
这给了我我想要的东西,但当然有一个警告,因为我没有使用结果模式重复的所有元素。
我在想的另一种方式是,使用kronecker 产品并有类似的东西:
kronecker(diag(5),t(c(1,rep(0,2),-1)))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,] 1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 0 1 0 0 -1 0 0 0 0 0 0 0 0
[4,] 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -1 0 0 0 0
[5,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -1
然后根据每行(从第二行开始)向左移动/滞后,直到获得我正在寻找的结果。在不使用lag 的情况下,有没有办法实现这种转变?或任何建议/替代解决方法?谢谢
【问题讨论】: