用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,这没有告诉我什么。