用R绘制Hankel矩阵

时间:2014-10-10 18:39:31

标签: r matrix

我想绘制一个Hankel矩阵,R仅使用R的matrix()seq()rep()函数。到目前为止,我以某种方式绘制了这个:

#Do this exercise with other packages, need to rework
install.packages("matrixcalc")
library(matrixcalc)
E1 <- hankel.matrix( 5, seq( 1, 9 ) )
print(E1)
#Use matrix() only, not efficient
E2 <- matrix(c(1,2,3,4,5,2,3,4,5,6,3,4,5,6,7,4,5,6,7,8,5,6,7,8,9), ncol=5)
print(E2)
#Use seq() but not worked
E3 <- matrix(c(seq(1:5),seq(2:6),seq(3:7),seq(4:8),seq(5:9)), ncol=5)
print(E3)

E1使用一个库来绘制一个Hankel矩阵,在E2中,我试图手动设置数字来绘制一个但是如果我想要一个新的大矩阵则会花费很多时间。我试图使用seq()但它没有用。它将如下绘制:

      [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]    2    2    2    2    2
[3,]    3    3    3    3    3
[4,]    4    4    4    4    4
[5,]    5    5    5    5    5

我对R来说还很新,所以欢迎任何想法。

2 个答案:

答案 0 :(得分:4)

你可以这样做:

matrix(rep(1:5,5)+rep(0:4,each=5),ncol=5)
#       [,1] [,2] [,3] [,4] [,5]
# [1,]    1    2    3    4    5
# [2,]    2    3    4    5    6
# [3,]    3    4    5    6    7
# [4,]    4    5    6    7    8
# [5,]    5    6    7    8    9

或更优雅,但使用outer

outer(0:4,1:5,'+')

编辑:

rep解决方案的工作原理如下:

    12345 12345 12345 ...  (rep times,      repeat the vector n times
  + 00000 11111 22222 ...  (rep with each , repeat each element n times
  = 12345 23456 34567 .....

outer一开始可能会很棘手,也许this answer here可以帮助您理解它并进行常规调试。

答案 1 :(得分:2)

我正在颠倒两种不同解决方案的顺序,以便合格的解决方案位于顶部:

一般函数(意思是不依赖于顺序的值)只使用一些额外的函数(如c()和“[”)来完成工作:

N <- c(9L, 7L, 3L, 2L, 1L, 8L, 4L, 5L, 6L, 10L)
hankel2 <- function(N, n){stopifnot(length(N)==2*n); 
                          matrix( rep(N,n)[c(rep(TRUE,n),rep(FALSE,n+1))], n) }
hankel2(N,5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    9    7    3    2    1
[2,]    7    3    2    1    8
[3,]    3    2    1    8    4
[4,]    2    1    8    4    5
[5,]    1    8    4    5    6

第一个(三个)努力的技巧是在“[”函数内部使用时依赖于逻辑向量的参数回收。通过使用FALSE(具有省略项目的效果)来选择n个项目后,它会创建n + 1个项目的间隙。


嵌入是一个可爱的小功能,有一个相当不透明的帮助文件,但偶尔提供非常紧凑的代码:

> x <- 1:10
> embed (x, 5)[1:5, 5:1]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    2    3    4    5    6
[3,]    3    4    5    6    7
[4,]    4    5    6    7    8
[5,]    5    6    7    8    9

你可以创造一个功能:

> hankel <- function( n ) embed(1:(2*n),5)[1:n, n:1]
> hankel(5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    2    3    4    5    6
[3,]    3    4    5    6    7
[4,]    4    5    6    7    8
[5,]    5    6    7    8    9

(不可否认,虽然我想知道到目前为止是否有任何解决方案能够达到一个不连续的向量,但我还是不按规格进行游戏。这一点确实如此:)

> hankel5 <- function( n ) embed(sample(1:10,10),5)[1:n, n:1]
> hankel5(5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    3    5    7    9    4
[2,]    5    7    9    4   10
[3,]    7    9    4   10    1
[4,]    9    4   10    1    8
[5,]    4   10    1    8    2

所以这是另一个一般功能:

hankel <- function( N, n ) {stopifnot(length(N) == 2*n); embed(N,n)[1:n, n:1]