QR分解的正交化输出略微无关的正交矩阵
Orthogonalization in QR Factorization outputting slightly innaccurate orthogonalized matrix
我正在编写QR分解的代码,由于某种原因,我的正交方法无法按预期工作。基本上,我的proj()方法正在输出随机投影。这是代码:
apmatrix<double> proj(apmatrix<double> v, apmatrix<double> u)
//Projection of u onto v
{
//proj(v,u) = [(u dot v)/(v dot v)]*v
double a = mult(transpose(u,u),v)[0][0], b = mult(transpose(v,v),v)[0][0], c = (a/b);
apmatrix<double>k;
k.resize(v.numrows(),v.numcols());
for(int i = 0; i<v.numrows(); i++)
{
for(int j = 0; j<v.numcols(); j++)
{
k[i][j]=v[i][j]*c;
}
}
return k;
}
我用手动矩阵输入本身对该方法进行了测试,并且似乎可以正常工作。这是我的正交方法:
apmatrix<double> orthogonal(apmatrix<double> A) //Orthogonal
{
/*
n = (number of columns of A)-1
x = columns of A
v0 = x0
v1 = x1 - proj(v0,x1)
vn = xn - proj(v0,xn) - proj(v1,xn) - ... - proj(v(n-1),xn)
V = {v1, v2, ..., vn} or [v0 v1 ... vn]
*/
apmatrix<double> V, x, v;
int n = A.numcols();
V.resize(A.numrows(),n);
x.resize(A.numrows(), 1);
v.resize(A.numrows(),1);
for(int i = 0; i<A.numrows(); i++)
{
x[i][0]=A[i][1];
v[i][0]=A[i][0];
V[i][0]=A[i][0];
}
for (int c = 1; c<n; c++) //Iterates through each col of A as if each was its own matrix
{
apmatrix<double>vn,vc; //vn = Orthogonalized v (avoiding matrix overwriting of v); vc = previously orthogonalized v
vn=x;
vc.resize(v.numrows(), 1);
for(int i=0; i<c; i++) //Vn = an-(sigma(t=1, n-1, proj(vt, xn))
{
for(int k = 0; k<V.numrows(); k++)
vc[k][0] = V[k][i]; //Sets vc to designated v matrix
apmatrix<double>temp = proj(vc, x);
for(int j = 0; j<A.numrows(); j++)
{
vn[j][0]-=temp[j][0]; //orthogonalize matrix
}
}
for(int k = 0; k<V.numrows(); k++)
{
V[k][c]=vn[k][0]; //Subtracts orthogonalized col to V
v[k][0]=V[k][c]; //v is redundant. more of a placeholder
}
if((c+1)<A.numcols()) //Matrix Out of Bounds Checker
{
for(int k = 0; k<A.numrows(); k++)
{
vn[k][0]=0;
vc[k][0]=0;
x[k][0]=A[k][c+1]; //Moves x onto next v
}
}
}
system("PAUSE");
return V;
}
出于测试目的,我一直在使用2D阵列:[[1,1,4],[1,4,2],[1,4,2],[1,1,0]]。每列都是其自己的4x1矩阵。矩阵应以:[1,1,1,1] t,[-1.5,1.5,1.5,-1.5] t和[2,0,0,0,-2] t。现在正在发生的事情是第一列出现正确(是相同的矩阵),但是第二和第三列出现了可能相似但不等于其预期值的东西。
再次,每次我调用正交方法时,都会输出一些不同的东西。我认为这是由于Proj()方法中输入的数字,但我不完全确定。
APMATRIX来自AP大学董事会,教授CPP。它类似于Java中的向量或数组清单。
这是指向apmatrix.cpp的链接,以及文档或条件(可能更有用),apmatrix.h。这是指向完整代码的链接(我添加了视觉标记以查看计算机在做什么)。
公平地假设所有自定义方法都按预期工作(可能是矩阵回归,但这是无关紧要的)。并确保在尝试分解之前,请使用Enter方法输入矩阵。该代码效率可能降低,部分原因是我不久前我自学过自己的CPP,我一直在尝试不同的方法来修复我的代码。谢谢您的帮助!
如注释中所述:
@AhMedFasih今天进行了更多测试后,我发现它是事实上的一些内存问题。我发现,由于某种原因,如果变量或apmatrix对象>在循环中声明,初始化,然后重申循环,则>内存并未完全擦除该变量或对象中存储的值。在我的代码中的两个位置中指出了这一点。无论出于何种原因,我都必须在proj方法中将> dubles a,b和c设置为>多方法中的apmatrixdh到0,否则它们将在下一个迭代中存储一些值。非常感谢您>您的帮助!
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 有人能分解一下这个c++模板的语法吗
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 下面的代码是如何工作的?它输出分解的数字并且功能齐全,我只是不明白它是如何做到的
- (C++)分解这个简单的输入/输出代码:
- QR分解的正交化输出略微无关的正交矩阵
- 给出错误的输出:如何将字符串分解为字典单词
- 素数分解函数输出