解線性方程組a『x=b使用函式lapacke_dgesv,函式原型如下,
lapack_int lapacke_dgesv(intmatrix_order, lapack_int n, lapack_int nrhs,
double
*a, lapack_int lda, lapack_int
*ipiv,
double
*b, lapack_int ldb );
/*//
引數說明:
matrix_order 矩陣的順序,兩種取值,lapack_col_major或是lapack_row_major。
如果是col_major,表示a[0:n-1]是第一列,a[n:2n-1]是第二列,表明矩陣的元素儲存順序。
lapack的優先選擇是col_major,當是row_major時,會先進行轉置,然後進行計算,然後轉置回來;
n 矩陣的size,係數矩陣應該是方陣,乙個5x5的矩陣,則n=5;
nrhs rhs的列數,lapack可以同時對乙個係數矩陣,多個rhs進行求解,
因為對係數矩陣只需要進行一次lu分解,多個rhs一起求解更方便;
a 係數矩陣;
lda leading dimension of a,lda>=max(1,n);
ipiv pivot的行交換記錄,第i行被交換到第ipiv[i]行;
b rhs,可以是多列。其元素儲存順序是
ldb leading dimension of b, ldb>=max(1,n),
本來看**中應該是ldb>=max(1,nrhs)的,ldb=nrhs的時候報錯了;
//返回值:
info = 0, 程式正常執行結束。
*/
測試**如下,參考
#include<
stdio.h
>
//lapacke headers
#include
"lapacke.h
"#include
"lapacke_config.h
"#include
"lapacke_utils.h
"extern
lapack_int lapacke_dgesv(
intmatrix_order, lapack_int n, lapack_int nrhs,
double
*a, lapack_int lda, lapack_int
*ipiv,
double
*b, lapack_int ldb );
intmain()
;doubleb[8
] =;int
ipiv[4];
intn =n;
intnrhs =2
;int
lda =n;
intldb =n;
intinfo
=lapacke_dgesv(lapack_col_major,n,nrhs,a,lda,ipiv,b,ldb);
printf(
"info:%d\n
",info);
if(info==0
)}}
程式執行輸出結果如下,
info:0x0120-
1x11.375
0.375
0.375
-0.375
表示的是a =
14-2
3220
430-
1212
2-3b
=612
2138
4x =1
1.375
20.375
00.375-1
-0.375
網上可以看到的lapacke的資料好像比較少,lapacke只是在lapack的基礎上進行封裝,介面引數有些不同,呼叫lapack函式之前進行了一系列的引數檢測。所以目前可參考的就是lapacke的源**。先檢視lapacke的源**,然後檢視對應的lapack的函式引數,基本上就可以正確呼叫這些函式了。lapack的函式說明可以參考下面的**
中使用的是clapack包,clapack的函式引數與lapack一致,不像lapacke,自己新增引數。
MATLAB 線性方程組求解
clc,clear all close all 高斯消去法 a 2 3 4 3 5 2 4 3 30 線性方程組的係數矩陣 b 6 5 32 線性方程組的右端列向量 m,n size a 測量係數矩陣的維數 if m n fprint 線性方程組的係數矩陣非方陣 break end fprintf ...
MATLAB線性方程組求解
對於一般的,有唯一解的線性方程組,我們可以轉換成矩陣的形式 a x bax b ax b 則可以用矩陣運算求解x,即x a b 求解齊次線性方程組基礎解系的函式是null z null a 表示返回矩陣a的基礎解系組成的矩陣。z還滿足ztz i z null a,r 得出的z不滿足ztz i,但得出...
SVD求解線性方程組
對於任一給定的矩陣am n boldsymbol am n 都存在這樣的分解 a u dv t boldsymbol boldsymbol boldsymbol boldsymbol t a udvt 這裡 u boldsymbol u是乙個 m m m times m m m 的正交矩陣,d bo...