Я хочу вычислить ошибку в методе линейных наименьших квадратов.
У меня есть матрицы A, B и X. (AX = B).
Размеры: A (NxN), B (NxNRHS), X (N, NRHS), где NRHS - номер правой стороны.
Ошибка вычисляется как sqrt (сумма (B -A X)).
Но я должен учитывать каждый столбец B и X, чтобы сделать это.
Я должен вычесть B [i] -A [..] X [i] → где я - каждый столбец из B и X.
Я не могу понять, как это сделать, следовательно, как извлечь каждый столбец. Я не могу найти правильные индексы для матриц B и X (я думаю), потому что я должен выйти за пределы матрицы A и только за каждый столбец B и X.
Я делаю что-то вроде этого (используя основной порядок столбцов):
int N=128;
int NRHS =1;
int Asize=N*N;
int Bsize=N*NRHS;
int Xsize=N*NRHS;
A=(double*)malloc(Asize*sizeof(double));
B=(double*)malloc(Bsize*sizeof(double));
X=(double*)malloc(Xsize*sizeof(double));
...
for(int i = 0; i < N; i++)
{
for (int j=0;j<NRHS; j++){
diff[i+j*N] = fabs(B[i+j*N] - A[i+j*N]*X[i+j*N]);
abs_error=sqrt(sums(diff,N));
}
}
Я думал о добавлении некоторого выражения с помощью оператора modulo, но я не мог понять.
sums - это просто функция, которая дает сумму массива, где вторым аргументом является количество элементов.
Сначала вы можете сделать матричное умножение A
и X
с помощью циклов.
Затем вы можете написать еще 2 циклы, чтобы вычислить разницу (B - AX
). Это просто ваша проблема.
редактировать
После того, как вы вычислите произведение A
и X
, считая, что вы храните продукт в переменной AX
, следующий код даст вам разницу между соответствующими элементами.
differenceMatrix = (double*)malloc(Bsize*sizeof(double));
for(int i = 0; i < N; i++)
{
for (int j = 0; j < NRHS; j++){
differenceMatrix[i+j*N] = fabs(B[i+j*N] - AX[i+j*N]);
}
}
Каждый столбец разницыMatrix содержит разницу между соответствующими элементами.
редактировать
Чтобы получить сумму разницы в каждом столбце
double sumOfDifferencePerColumn;
for(int i = 0; i < N; i++)
{
sumOfDifferencePerColumn = 0.0;
for (int j = 0; j < NRHS; j++){
sumOfDifferencePerColumn += ( fabs(B[i+j*N] - AX[i+j*N]) );
}
// add code to take square root or use the sum of difference of each column
}
A
,B
иX
? Как вы передаете их функции? Что такоеsums()
?