RNimble 的 LQ 因式分解函数

LQ factorization function for RNimble

提问人:EM823823 提问时间:11/12/2023 最后编辑:EM823823 更新时间:11/12/2023 访问量:29

问:

我需要在 R 中编写一个函数,将矩形 m x n (m > n) 矩阵 A 分解为一个 m x n 下三角形 L 矩阵和一个 n x n 正交 Q 矩阵。我需要写出该方法的每个步骤,以便我可以在我的 nimbleCode 函数中使用它。具体来说,我需要的是一个函数,该函数执行 lq() 函数从 tensr 包中执行的操作,此外还需要写出所有步骤。到目前为止,我所拥有的函数如下(它们给出了 A' 的 Gram-Schmidt 分解),但问题是它们生成了一个 nxm 正交矩阵 Q 和一个 mxm 下三角矩阵 L,这不是我需要的。我希望有人能帮我重写代码以获得我需要的东西。

nimQR.Q = nimbleFunction(
  run = function(A = double(2)){
    returnType(double(2))
    A1 = t(A)
    m <- dim(A1)[1]
    n <- dim(A1)[2]
    Q <- matrix(0, m, n)
    R <- matrix(0, n, n)
    for (k in 1:n) {
      Q[1:m, k] <- A1[1:m, k]
      if (k > 1) {
        for (i in 1:(k - 1)) {
          R[i, k] <- t(Q[1:m, i]) %*% Q[1:m, k]
          Q[1:m, k] <- Q[1:m, k] - R[i, k] * Q[1:m, i]
        }
      }
      R[k, k] <- sum(abs(Q[, k])^2)^(1/2)
      Q[1:m, k] <- Q[1:m, k]/R[k, k]
    }
    return(Q)
})

nimQR.R = nimbleFunction(
  run = function(A = double(2)){
    returnType(double(2))
    A1 = t(A)
    m <- dim(A1)[1]
    n <- dim(A1)[2]
    Q <- matrix(0, m, m)
    R <- matrix(0, n, n)
    for (k in 1:n) {
      Q[1:m, k] <- A1[1:m, k]
      if (k > 1) {
        for (i in 1:(k - 1)) {
          R[i, k] <- t(Q[1:m, i]) %*% Q[1:m, k]
          Q[1:m, k] <- Q[1:m, k] - R[i, k] * Q[1:m, i]
        }
      }
      R[k, k] <- sum(abs(Q[1:m, k])^2)^(1/2)
      Q[1:m, k] <- Q[1:m, k]/R[k, k]
    }
    return(t(R))
    
  })

r 函数 线性代数 矩阵

评论


答: 暂无答案