c++ - 计算线性系统的误差 - 提取每一列

标签 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] -> 其中 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 只是一个函数,它给出数组的总和,其中第二个参数是元素的数量。

最佳答案

您可以先使用循环对 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
}

关于c++ - 计算线性系统的误差 - 提取每一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22078581/

相关文章:

c++ - C++ 中的 move 语义是否缺少 C 所缺少的东西?

c - 如何从 C 中读取 Torch 张量

c++ - 更改 clion 中的默认 cmakelists.txt

python - 在 NumPy 中向量化向量矩阵乘法

python - 如何使用带有 boolean 数组的 np.infs 将数组的所有索引归零?

c++ - 在 C++ 中创建一个 json 数组

c++ - 为什么我的函数调用不匹配这个通用函数实现?

c - sprintf 缩放整数。 123 打印为 12,3

matlab - SVD 在 Matlab 和 OpenCV 中计算不同的结果

c++ - gcc 和 g++ 错误 : error trying to exec 'cc1plus' : execvp: No such file or directory