【问题标题】:Draw a Hankel matrix with R用 R 画汉克尔矩阵
【发布时间】:2014-10-11 07:02:56
【问题描述】:

我想用 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 还是很陌生,所以欢迎每个想法。

【问题讨论】:

  • 顺便说一句:seq 调用不正确,不应在 seq 中使用“:”。或者只是使用“:”...E3 &lt;- matrix( c(1:5,2:6,3:7,4:8,5:9), ncol=5) print(E3)
  • 你能解释一下为什么不应该在seq()里面使用:吗?
  • 因为参数的位置匹配(参数没有名称)会给第一个参数一个多元素向量,而第二个参数没有值。 ":" 函数实际上是 seq 函数的中缀版本

标签: r matrix


【解决方案1】:

你可以这样做:

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 可以帮助您理解它并进行一般调试。

【讨论】:

  • 如果您能解释代码中的参数以及rep(),我将不胜感激。我读了它的定义,但实际上我就是无法理解。我对 R 还是很陌生 :(
  • outer() 的同样问题,我无法理解它是如何工作的。我问我的教授如何在 R 中调试,但他只是指导我使用Ctrl+Enter 来检查每一步,是否有任何解决方案可以在 R 中使用 R Studio 进行调试
  • @Tuong - 在 RStudio Debug 下拉菜单中,查看 On Error 的不同选择
  • @Tuong 我添加了一些解决方案的解释以及如何调试外部。
  • @agstudy 我想我知道如何同时使用两个rep(),但是对于1:n,这种方式仍然适用吗?我稍后会读到outer。@RichardScriven 我只是想要进入一个循环,或者一些原生函数来读取变量在每一步之后如何变化,就像 C 或 C++ 一样,我们可以在 R 中做到吗?
【解决方案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 个项目的间隙(具有省略项目的效果。)


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

> 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]

【讨论】:

  • 我尝试只使用一些基本功能,如 matrix()seq()rep(),但 +1 为您提供帮助
  • 我想这两个函数都可以通过将“n”计算为length(N)/2来简化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2019-12-07
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
相关资源
最近更新 更多