Я пишу код для QR Factorization, и по какой-то причине мой ортогональный метод не работает, как предполагалось. По сути, мой метод 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]]. Каждый столбец имеет свою собственную матрицу 4×1. Матрицы должны быть выведены как: [1,1,1,1] T, [-1,5,1,5,1,5, -1,5] T и [2,0,0, -2] T соответственно. Что происходит сейчас, так это то, что первый столбец получается правильно (это та же матрица), но второй и третий получаются с чем-то, что потенциально похоже, но не равно их предполагаемым значениям.
Опять же, каждый раз, когда я вызываю ортогональный метод, он выводит что-то другое. Я думаю, что это связано с числами, введенными в методе proj (), но я не совсем уверен.
Апатрикс от совета колледжа AP, когда они преподавали cpp. Это похоже на векторы или ArrayLists в Java.
Вот ссылка на apmatrix.cpp и документацию или условия (возможно, более полезные), apmatrix.h.
Вот это ссылка на полный код (я добавил визуальные маркеры, чтобы увидеть, что делает компьютер).
Справедливо предположить, что все пользовательские методы работают как задумано (за исключением, может быть, матричных регрессий, но это не имеет значения). И обязательно вводите матрицу, используя метод ввода, прежде чем пытаться разложить на множители. Код может быть неэффективным, отчасти потому, что я не так давно самообучался cpp и пробовал разные способы исправить свой код. Спасибо вам за помощь!
Как сказано в комментариях:
@AhmedFasih Сегодня, проведя больше тестов, я обнаружил, что на самом деле это некая проблема с памятью. Я обнаружил, что по какой-то причине, если переменная или объект apmatrix> объявлены в цикле, инициализированы, то этот цикл повторяется,> память не полностью стирает значение, хранящееся в этой переменной или объекте. Это> отмечено в двух местах в моем коде. По какой-то причине мне пришлось установить> удваивает a, b и c на 0 в методе proj и apmatrixdh на 0 в методе> mult, иначе они сохранят какое-то значение на следующей итерации. Большое вам спасибо за помощь!
Других решений пока нет …