2

我正在尝试解决一些线性方程(对称、三对角和正)。我必须使用拉帕克。我的代码如下:

#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 相同?)

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

4

2 回答 2

2

因此,必须查看纯 LAPACK 的文档(http://www.netlib.org/lapack/explore-html/d0/dea/dptsv_8f.html#af1bd4c731915bd8755a4da8086fd79a8),并忽略不正确的(在 LAPACKE 的情况下)备注LDB 大于或等于 max(1,N)。

正确的程序如下:

#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);
}  
于 2015-01-27T23:14:52.300 回答
1

在 BLAS 和/或 LAPACK 的文档方面,英特尔可能是最全面的。您可以查找?ptsv的文档,其中解释了每个参数的用途。

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

这是相关的片段:

该例程求解X线性方程组的实数或复数系统A*X = B,其中A是一个对称/n厄米n正定三对角矩阵,矩阵的列B是单独的右侧,而 的列X是相应的解。

A被分解为A = L*D*LT(真正的味道)或A = L*D*LH(复杂的味道),A然后使用分解后的形式来求解方程组A*X = B

输入参数

n:矩阵的顺序An ≥ 0.

nrhs: 右边数,列数Bnrhs ≥ 0.

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

e, b: 数组: e(n - 1), b(ldb,*). 该数组e包含 的下(n - 1)对角线元素A。数组 b 包含矩阵B,其列是方程组的右侧。的第二维b必须至少为max(1,nrhs)

ldb: 的领先维度b; ldb ≥ max(1, n).

输出参数

d:被的(实数)/ (复数)因式分解的n对角矩阵的对角元素覆盖。DL*D*LTL*D*LHA

e: 被分解(n - 1)的单位双对角因子的对角元素覆盖。LA

b: 被解矩阵覆盖X

info: 如果info = 0,则执行成功。如果info = -i,则i-th 参数具有非法值。如果info = i,则前导次要顺序i(因此矩阵A本身)不是正定的,并且尚未计算解。分解尚未完成,除非i = n.

于 2015-01-27T23:34:28.493 回答