从线性系统计算误差 - 提取每列

时间:2014-02-27 19:35:20

标签: c++ c linear-algebra

我想用线性最小二乘法计算误差。

我有矩阵A,B和X.(AX = B)。

尺寸为:A(NxN),B(NxNRHS),X(N,NRHS),其中NRHS是右手边的数量。

错误计算为sqrt(sum(B-AX))。

但我必须考虑到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只是一个函数,它给出了一个数组的总和,其中第二个参数是元素的数量。

1 个答案:

答案 0 :(得分:1)

您可以先使用循环对AX进行矩阵乘法。

然后你可以写另外2个循环来计算差异(B - AX)。这只是你的问题。

修改

在计算AX的产品后,假设您将产品存储在名为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
}