克·施密特(R) [英] Gram Schmidt with R

查看:42
本文介绍了克·施密特(R)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里是第1页的执行Gram Schmidt的MATLAB代码 http://web.mit.edu/18.06/www/Essays/gramschmidtmat.pdf

Here is a MATLAB code for performing Gram Schmidt in page 1 http://web.mit.edu/18.06/www/Essays/gramschmidtmat.pdf

由于没有MATLAB,我花了数小时尝试用R来执行此操作 这是我的R

I am trying for hours and hours to perform this with R since I don't have MATLAB Here is my R

f=function(x){
m=nrow(x);
n=ncol(x);
Q=matrix(0,m,n);
R=matrix(0,n,n);

for(j in 1:n){
v=x[,j,drop=FALSE];

for(i in 1:j-1){
R[i,j]=t(Q[,i,drop=FALSE])%*%x[,j,drop=FALSE];
v=v-R[i,j]%*%Q[,i,drop=FALSE]
}

R[j,j]=max(svd(v)$d);
Q[,j,,drop=FALSE]=v/R[j,j]}

return(list(Q,R))}

它一直在说其中任何一个有错误:

It keeps on saying there is errors in either:

v=v-R[i,j]%*%Q[,i,drop=FALSE] 

R[j,j]=max(svd(v)$d);

将MATLAB代码转换为R时我做错了什么?

What is it that I am doing wrong translating MATLAB code to R???

推荐答案

您可以简单地使用Hans W. Borchers的

You could simply use Hans W. Borchers' pracma package, which provides many Octave/Matlab functions translated in R.

> library(pracma)
> gramSchmidt
function (A, tol = .Machine$double.eps^0.5) 
{
    stopifnot(is.numeric(A), is.matrix(A))
    m <- nrow(A)
    n <- ncol(A)
    if (m < n) 
        stop("No. of rows of 'A' must be greater or equal no. of colums.")
    Q <- matrix(0, m, n)
    R <- matrix(0, n, n)
    for (k in 1:n) {
        Q[, k] <- A[, k]
        if (k > 1) {
            for (i in 1:(k - 1)) {
                R[i, k] <- t(Q[, i]) %*% Q[, k]
                Q[, k] <- Q[, k] - R[i, k] * Q[, i]
            }
        }
        R[k, k] <- Norm(Q[, k])
        if (abs(R[k, k]) <= tol) 
            stop("Matrix 'A' does not have full rank.")
        Q[, k] <- Q[, k]/R[k, k]
    }
    return(list(Q = Q, R = R))
}
<environment: namespace:pracma>

这篇关于克·施密特(R)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆