ホーム
> LAPACKサンプル
> 実行列の疑似逆行列とランク
Keyword: 疑似逆行列, ランク, 階数, 逆行列
概要
本サンプルプログラムはLAPACKルーチンDGELSSを利用します。DGELSSは線形最小二乗問題を解くためのルーチンですが、本サンプルではそれを応用して実行列の疑似逆行列とランクを求めます。
本サンプルは以下に示す行列の疑似逆行列とランクを求め、その結果を出力します。
ご相談やお問い合わせはこちらまで
入力データ
(標準入力から与えて下さい)1 2 3 4 5 6 7
このデータをダウンロード |
6 5 7.0 -2.0 4.0 9.0 1.8 3.0 8.0 -4.0 6.0 1.3 9.0 6.0 1.0 5.0 2.1 -8.0 7.0 5.0 2.0 0.6 4.0 -1.0 2.0 8.0 1.3 1.0 6.0 3.0 -5.0 0.5
- 1行目に行列Aの行数mと列数nを指定しています。
- 2~7行目に6x5の行列Aの要素を指定しています。
出力結果
1 2 3 4 5 6 7 8
この出力例をダウンロード |
Rank = 4 Transpose of psedo-inverse 1.7807E-02 -2.1565E-02 5.2029E-02 2.3686E-02 7.1957E-03 -1.1826E-02 4.3417E-02 -8.1265E-02 3.5717E-02 -1.3957E-03 4.7157E-02 2.9446E-02 1.3926E-02 -1.3808E-02 7.6720E-03 -5.6636E-02 2.9132E-02 4.7442E-02 3.0478E-02 5.0415E-03 -3.6741E-03 -1.3781E-02 1.6647E-02 3.5665E-02 3.4857E-03 3.8408E-02 3.4256E-02 5.7594E-02 -5.7134E-02 7.3123E-03
- 1行目に行列Aのランクが出力されています。
- 3~8行目に疑似逆行列の転置行列が出力されています。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
このソースコードをダウンロード |
Program ginv Implicit None Integer m, n, lda, ldb, nrhs, i, rank, info, lwork Double Precision, Allocatable :: a(:, :), b(:, :), s(:), work(:) Double Precision :: temp(1) Read (*, *) m, n lda = m ldb = max(m, n) nrhs = ldb Allocate (a(lda,n), b(ldb,ldb), s(min(m,n))) Call dgelss(m, n, nrhs, a, lda, b, ldb, s, -1D0, rank, temp, -1, info) ! query work area size lwork = temp(1) Allocate (work(lwork)) Read (*, *)(a(i,1:n), i=1, m) b = 0D0 ! initialize as identity matrix Do i = 1, ldb b(i, i) = 1D0 End Do Call dgelss(m, n, nrhs, a, lda, b, ldb, s, -1D0, rank, work, lwork, info) Print *, 'Rank =', rank Print *, 'Transpose of psedo-inverse' Do i = 1, m Print '(999999(ES12.4))', b(1:n, i) End Do End Program