我试图解决一些线性方程(对称,三对角和正)。我必须使用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的功能似乎什么都不做,没有任何错误。主要问题是,我不知道函数参数代表什么。我搜索的时间很长,但没有真正的文档。以下是我设法找到或猜测的内容:
我怎样才能找到这些论点的真正含义?如何使我的代码工作?
答案 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
,其中A
是n
- 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
的对角元素。
e
,b
:数组: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
。