実行列の疑似逆行列とランク

LAPACKを用いたサンプルソースコード : 使用ルーチン名:dgelss

ホーム > LAPACKサンプル > 実行列の疑似逆行列とランク

Keyword: 疑似逆行列, ランク, 階数, 逆行列

概要

本サンプルプログラムはLAPACKルーチンDGELSSを利用します。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


ご案内
関連情報
© 日本ニューメリカルアルゴリズムズグループ株式会社 2025
Privacy Policy  /  Trademarks