用R画一个Hankel矩阵

用R画一个Hankel矩阵,r,matrix,R,Matrix,我想用R绘制一个Hankel矩阵,只使用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 effic

我想用R绘制一个Hankel矩阵,只使用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)
我对R还是一个新手,所以每个想法都是受欢迎的。

你可以这样做:

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(0:4,1:5,'+')
编辑:
rep
解决方案的工作原理如下:

      [,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
    12345 12345 12345 ...  (rep times,      repeat the vector n times
  + 00000 11111 22222 ...  (rep with each , repeat each element n times
  = 12345 23456 34567 .....
外部
一开始可能很棘手,可能会帮助您理解它并进行常规调试。

您可以这样做:

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(0:4,1:5,'+')
编辑:
rep
解决方案的工作原理如下:

      [,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
    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
一开始可能很棘手,也许可以帮助您理解它并进行常规调试。

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

一个通用函数(即不依赖于连续值的函数),它只使用两个额外函数(如
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
汉克尔·汉克尔(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 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 ) 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
hankel <- function( N, n ) {stopifnot(length(N) == 2*n); embed(N,n)[1:n, n:1]

hankel我正在颠倒两种不同解决方案的顺序,以使符合条件的解决方案位于顶部:

一个通用函数(即不依赖于连续值的函数),它只使用两个额外函数(如
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
汉克尔·汉克尔(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 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 ) 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
hankel <- function( N, n ) {stopifnot(length(N) == 2*n); embed(N,n)[1:n, n:1]


hankel如果您能解释代码中的参数以及关于
rep()
,我将不胜感激。我阅读了它的定义,但实际上我不理解它。我对R还是非常陌生:(与
outer()相同的问题)
,我不明白它是如何工作的。我问教授如何在R中调试,但他只是指导我使用
Ctrl+Enter
检查每一步,是否有任何解决方案可以在R中调试Studio@Tuong-在RStudio
Debug
下拉菜单中,查看
On Error
@Tuong的不同选项,我添加了一些解释关于解决方案的定义,以及如何调试外部系统。@agstudy我想我了解了如何使用two
rep()<代码> >但是对于<代码> 1:n>代码>这一方法是否仍然适用?我稍后会阅读<代码>外部<代码>。@ ReHdScript我只想进入一个循环,或者一些原生函数来读取每个步骤之后变量如何变化,就像C或C++一样,我们能在R中做吗?如果你能解释代码中的参数,我将非常感激。关于
rep()
,我不明白它是如何工作的。我问教授如何在R中调试,但他只是指导我使用
Ctrl+Enter
检查每一步,是否有任何解决方案可以在R中调试Studio@Tuong-在RStudio
Debug
下拉菜单中,查看
On Error
@Tuong的不同选项,我添加了一些解释关于解决方案的定义,以及如何调试外部系统。@agstudy我想我了解了如何使用two
rep()一起,但是对于<代码> 1:N< /代码>这方法仍然适用吗?稍后我将阅读<代码>外部< /代码>。@ ReHdScript我只想进入一个循环,或者一些原生函数来读取每个步骤之后的变量如何变化,就像C或C++一样,我们能在R中做吗?我尝试只使用一些基本函数,如<代码>矩阵()。
seq()
rep()
仅限于+1供您帮助,我想这两个函数都可以通过将“n”计算为
length(n)/2来简化。我尝试只使用一些基本函数,如
matrix()
seq()
rep()
仅限于+1供您帮助我想这两个函数都可以通过将“n”计算为
length(n)/2来简化。顺便说一句:seq调用不正确,不应该使用“:”inside seq.或只是使用“:…
E3您能解释为什么不应该使用
inside
seq()
”因为参数的位置匹配吗(参数没有名称)将为第一个参数提供多元素向量,而为第二个参数提供值。函数“:”-实际上是
seq
functionBTW的中缀版本:seq调用不正确,不应使用“:“inside seq.Or just use”:…
E3您能解释一下为什么不应该在
seq()
中使用
?因为参数的位置匹配(参数没有名称)会给第一个参数提供一个多元素向量,而给第二个参数没有值。:“-函数实际上是
seq
函数的中缀版本