如何应用循环遍历 R 中的矩阵

Posted

技术标签:

【中文标题】如何应用循环遍历 R 中的矩阵【英文标题】:How to apply a loop that iterates over a matrix in R 【发布时间】:2022-01-06 23:00:08 【问题描述】:

我正在尝试使用随机化的输出作为下一次迭代的输入。所以,我设置了一个随机化矩阵的函数/循环,如果新矩阵的第一个元素大于旧矩阵的第一个元素(F.new > F.old),我想存储F.new 值,然后再次随机化。

如果它减少了三个迭代,我想停止循环并返回输出。我遇到的麻烦是将新的输出/矩阵传递回循环的开头。

random <- function(x, na.rm = FALSE)(rnorm(n=1,x, x*.3))
F_data <- c(1,2,3,4,5,6,7,8,9)
F_00 <- matrix(F_data,nrow=3,ncol=3,byrow=TRUE)

KK <- 1:1e4
Testrun <- function(F_0)
  loop <- 1
  for(i in KK)
  F <- F_0
  F.New <-apply(F_0, c(1,2), random)
  if (F.New[1,1] > F[1,1])
    print(loop+1)
    return(F.New)
  
  F <- F.New


tt <- Testrun(F_00)
'''

【问题讨论】:

如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。 感谢 Flick 先生,现在刚刚添加了一些可重现的代码 :)。 嗨@OceanColour,你能解决这个问题吗? 【参考方案1】:

我建议不要使用 F 作为变量名,因为 R 将其解释为合乎逻辑的!

使用此种子,需要 5 次迭代才能达到您的标准。如果您想将最大迭代次数设置为 100(例如),您可以将 while 条件更改为 while(counter&lt;3 | iter&lt;101)

首先,设置代码并监控它是如何工作的:

set.seed(99)

random <- function(x, na.rm = FALSE)
  rnorm(n=1, x, x*0.3)


fdata <- c(1,2,3,4,5,6,7,8,9)

# Initial data
f <- matrix(fdata, nrow=3, ncol=3, byrow=TRUE)

# Keep track of the matrices created on each iteration
hist <- list(f)
# Count total iterations
iter <- 0
# Count times condition is met
cond.count <- 0

# Monitor counter value in while-iterator
while(cond.count<3)
  # Keep track of iterations
  iter <- iter + 1
  # Randomize input data
  f2 <- apply(f, c(1,2), random)
  # Save the new matrix in a list
  hist[[iter]] <- f2
  # Check if new value is lower than old value
  # If it is, increase counter value
  if(f2[1,1] < f[1,1])
    cond.count <- cond.count + 1
  
  # If counter<3, iterator will repeat
  # using new matrix as input
  f <- f2


hist
#> [[1]]
#>          [,1]     [,2]     [,3]
#> [1,] 1.064189 2.266315 2.222539
#> [2,] 4.575590 4.455743 6.881324
#> [3,] 7.184440 8.294418 8.016884
#> 
#> [[2]]
#>           [,1]      [,2]     [,3]
#> [1,] 0.6509934 2.7762730 2.222717
#> [2,] 3.5518898 1.1025014 6.067912
#> [3,] 9.1706873 0.7275844 3.819979
#> 
#> [[3]]
#>            [,1]      [,2]     [,3]
#> [1,]  0.7483752 3.4030278 2.371195
#> [2,]  3.8406092 1.0828493 7.072369
#> [3,] 12.1940470 0.6523736 4.603429
#> 
#> [[4]]
#>            [,1]      [,2]     [,3]
#> [1,]  0.6258184 4.8047900 2.462318
#> [2,]  2.2650728 1.2291173 2.203635
#> [3,] 17.3157364 0.6237421 2.716158
#> 
#> [[5]]
#>            [,1]      [,2]     [,3]
#> [1,]  0.5887425 5.2700282 2.256607
#> [2,]  2.3113386 1.2781512 1.177351
#> [3,] 17.7858764 0.3095137 1.591914

然后定义为函数:

# Original input data
f <- matrix(fdata, nrow=3, ncol=3, byrow=TRUE)

myfunc <- function(f)
  set.seed(99) #remove this
  cond.count <- 0
  while(cond.count<3)
    f2 <- apply(f, c(1,2), random)
    if(f2[1,1] < f[1,1])
      cond.count <- cond.count + 1
    
    f <- f2
  
  # Return newest matrix when counter>=3
  return(f)



# Since we are using the same seed, we'd expect this to be the same as hist[[5]]
myfunc(f)
#>            [,1]      [,2]     [,3]
#> [1,]  0.5887425 5.2700282 2.256607
#> [2,]  2.3113386 1.2781512 1.177351
#> [3,] 17.7858764 0.3095137 1.591914

Created on 2021-12-16 by the reprex package (v2.0.1)

【讨论】:

以上是关于如何应用循环遍历 R 中的矩阵的主要内容,如果未能解决你的问题,请参考以下文章

R:循环遍历目录中的所有文件,应用列替换命令

R中的存储问题。替代用于创建矩阵数组和多个绘图的嵌套循环

循环遍历 R 中的列并提取字符

循环遍历R中的数据集时替换列标题中的空格

R:循环矩阵对特定行单独排序列

Jest 循环遍历动态测试用例