如何应用循环遍历 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<3 | iter<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 中的矩阵的主要内容,如果未能解决你的问题,请参考以下文章