用LAPACKE求解线性方程

时间:2015-01-27 18:45:02

标签: c linear-algebra lapack lapacke

我试图解决一些线性方程(对称,三对角和正)。我必须使用LAPACKE。我的代码如下:

#include <lapacke.h>
#include <stdio.h>



void print_mtrx(double * mtrx, int n, int m)
{
    int i, j;

    for(i = 0; i < n; i++)
    {
        for(j = 0; j < m; j++)
        {
            printf("%f ", mtrx[i*m+j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main()
{
    double matrix[5*5] = {
        2,  0,  0,  0,  0,
        0,  2,  0,  0,  0,
        0,  0,  2,  0,  0,
        0,  0,  0,  2,  0,
        0,  0,  0,  0,  2
    };

    double rozw[5] = {1,2,3,4,5};

    double matrix2[5*5] = {
        7,  0,  0,  0,  0,
        0,  7,  0,  0,  0,
        0,  0,  7,  0,  0,
        0,  0,  0,  7,  0,
        0,  0,  0,  0,  7
    };



    LAPACKE_dptsv(LAPACK_COL_MAJOR, 5, 5, matrix, matrix2, rozw, 5);

    print_mtrx(matrix, 5, 5);
    print_mtrx(matrix2, 5, 5);
    print_mtrx(rozw, 5, 1);

}

LAPACKE的功能似乎什么都不做,没有任何错误。主要问题是,我不知道函数参数代表什么。我搜索的时间很长,但没有真正的文档。以下是我设法找到或猜测的内容:

  • int matrix_order - LAPACK_COL_MAJOR或LAPACK_ROW_MAJOR,矩阵如何在内存中表示
  • lapack_int n - 矩阵的大小(即列数)
  • lapack_int nrhs - 不确定,也许是矢量b的大小
  • double * d - 方程矩阵
  • double * e - 不知道。
  • double * b - 来自d
  • 的方程解的向量
  • lapack_int ldb - b的前导方向(因此?它与nrhs不同,nrhs本身与n相同?)

我怎样才能找到这些论点的真正含义?如何使我的代码工作?

2 个答案:

答案 0 :(得分:2)

因此,必须查看纯LAPACK(http://www.netlib.org/lapack/explore-html/d0/dea/dptsv_8f.html#af1bd4c731915bd8755a4da8086fd79a8)的文档,并忽略LDB大于或等于max(1,N)的错误(如果是LAPACKE)。

正确的程序如下:

#include <lapacke.h>
#include <stdio.h>



void print_mtrx(double * mtrx, int n, int m)
{
    int i, j;

    for(i = 0; i < n; i++)
    {
        for(j = 0; j < m; j++)
        {
            printf("%f ", mtrx[i*m+j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main()
{
    double diagonal[5] = {5,1,5,1,5};
    double subdiagonal[4] = {0,0,0,0};

    double solution[5] = {1,2,3,4,5};


    LAPACKE_dptsv(LAPACK_ROW_MAJOR, 5 /*size of matrix*/, 1 /*number of columns in solution*/,
                  diagonal, subdiagonal, solution, 1 /*leading dimension of solution vector*/);

    print_mtrx(solution, 5, 1);
}  

答案 1 :(得分:1)

对于BLAS和/或LAPACK的文档,Intel可能是最全面的。您可以查找?ptsv的文档,其中说明了每个参数的用途。

(提示:在Google中搜索BLAS或LAPACK时,请务必放弃s / d / c / z前缀。)

以下是相关代码段:

  

例程解X实数或复数线性方程组A*X = B,其中An - by - n对称/ Hermitian正定三对角矩阵,矩阵B的列是单独的右侧,X的列是相应的解。

     

A被考虑为A = L*D*LT(真实风味)或A = L*D*LH(复杂风味),然后A的因式形式用于求解方程组A*X = B

     

输入参数

     

n:矩阵A的顺序; n ≥ 0

     

nrhs:右侧的数量,B中的列数; nrhs ≥ 0

     

d:数组,维度至少为max(1, n)。包含三对角矩阵A的对角元素。

     

eb:数组:e(n - 1)b(ldb,*)。数组e包含(n - 1)的{​​{1}}子对角元素。数组b包含矩阵A,其列是方程组的右侧。 B的第二个维度必须至少为b

     

max(1,nrhs)ldb的主要维度; b

     

输出参数

     

ldb ≥ max(1, n):来自d(真实)/ n(复杂){D分解的对角矩阵L*D*LT的{​​{1}}对角线元素覆盖{1}}。

     

L*D*LH:由A的分解中的单位bidiagonal因子e的{​​{1}}子对角元素覆盖。

     

(n - 1):由解决方案矩阵L覆盖。

     

A:如果b,执行成功。如果X,则info - 参数具有非法值。如果info = 0,则订单info = -i的主要次要(因此矩阵i本身)不是正定的,并且尚未计算解。除非info = i

,否则分解尚未完成