我想用线性最小二乘法计算误差。
我有矩阵A,B和X。(AX = B)。
大小为:A(NxN),B(NxNRHS),X(N,NRHS),其中NRHS是右手边的编号。
该错误计算为sqrt(sum(B-AX))。
但是我必须考虑B和X的每一列,以便进行减法。
我必须减去B [i] -A [.. X] [[i]->,其中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));
}
}
我想使用模运算符添加一些语句,但是我不知道。
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]);
}
}
DifferenceMatrix的每一列都包含相应元素之间的差异。
编辑
获取每列的差之和
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
}