如何循环直到我得到一个正定矩阵

How to looping until I get a positive definite matrix

我想我有一个简单的问题,我真正的问题是有时我的循环得到一个非 'positive definite' 矩阵,然后我无法使用该矩阵从正态分布生成随机值作为比例参数。所以,我一直在苦苦思索如何再次计算,直到我得到一个 'positive definite'。我做了一个可以提供帮助的简单示例:

test = function(a){
  b = rnorm(1) + a
  c = b - .5
  return(c)
}
replicate(20,test(.5))

[1]  0.93297282  1.17247501 -0.06919809  0.71069048 -0.12760964  1.46818526 -1.34637900  0.85637634 -0.03191685
[10]  0.24198938  0.26555849 -0.47910932  0.11841441  1.92971628 -1.23540504 -0.07653842 -0.08895779  1.32780821
[19] -0.03604193  0.13845360

假设我希望 'c' 为正数,每当 'c' 为负数时我希望再次生成 'b'。我知道我们可以截断,但在我的真实情况下,我需要返回并再次生成变量 'b',直到我得到 'c'.

的 20 个正值

关于我该怎么做的任何提示?

您可以使用 repeat 循环,并且 break 如果 c >= 0

test <- function(a) {
  repeat({
    b <- rnorm(1) + a
    c <- b - .5
    if (c >= 0) break
  })
  return(c)
}

set.seed(42)
replicate(20, test(.5))
# [1] 1.37095845 0.36312841 0.63286260 0.40426832 1.51152200 2.01842371
# [7] 1.30486965 2.28664539 0.63595040 1.32011335 1.21467470 1.89519346
# [13] 0.46009735 0.45545012 0.70483734 1.03510352 0.50495512 0.03612261
# [19] 0.20599860 0.75816324