Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用LAPACKE解线性方程_C_Linear Algebra_Lapack_Lapacke - Fatal编程技术网

用LAPACKE解线性方程

用LAPACKE解线性方程,c,linear-algebra,lapack,lapacke,C,Linear Algebra,Lapack,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++) { pr

我试图解一些线性方程(对称的,三对角的,正的)。我得用拉帕克。我的代码如下:

#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);

}
#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);
}  
#包括
#包括
无效打印\u mtrx(双*mtrx,整数n,整数m)
{
int i,j;
对于(i=0;i
拉帕克函数似乎什么也不做,没有任何错误。主要问题是,我不知道函数参数代表什么。我搜索了很久,但没有真正的文档。以下是我设法发现或猜测的:

  • int矩阵的顺序——LAPACK列或LAPACK行,矩阵在内存中是如何表示的
  • lapack_int n——矩阵的大小(即列数)
  • 不确定,可能是向量b的大小
  • double*d——方程矩阵
  • 我不知道
  • double*b——d方程解的向量
  • lapack_int ldb——b的主导方向(为什么?它与nrhs不同,nrhs本身与n相同?)

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

因此,必须查看纯LAPACK()的文档,并且忽略不正确的(对于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 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);

}
#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);
}  
#包括
#包括
无效打印\u mtrx(双*mtrx,整数n,整数m)
{
int i,j;
对于(i=0;i
对于BLAS和/或LAPACK的文档,可能是最全面的。您可以查找文档,这解释了每个参数的用途

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

以下是相关片段:

该例程为
X
线性方程组的实系统或复杂系统
A*X=B
,其中
A
是一个
n
-by-
n
对称/厄米特正定三对角矩阵,矩阵
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
的对角元素

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

ldb
:b的前导维度<代码>后勤数据库≥ 最大值(1,n)

输出参数
d
:由
A
L*d*LT
(实数)/
L*d*LH
(复数)因式分解中的对角矩阵
n
对角线元素
d
覆盖

e
:由
A
的因式分解产生的单位双对角线因子
L
(n-1)
次对角线元素覆盖

b
:被解决方案矩阵
X
覆盖

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


您尚未检查函数返回值。这是
LAPACKE\u dptsv()
的源代码,这是
LAPACKE\u dptsv\u work()
的源代码,它调用@WeatherVane返回2,这没有告诉我什么。