スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

TNT:使い方メモ

すっかりお世話になっているTNT。
基本的な使い方の説明があまりないので苦労してます。
試行錯誤でようやく分かってきた使い方をまとめておきます。

#include <tnt_array1d.h>
#include <tnt_array1d_utils.h>
#include <tnt_array2d.h>
#include <tnt_array2d_utils.h>
#include <tnt_cmat.h>
#include <jama_lu.h>


int
main(int, char *[])
{
//2次元配列の定義
TNT::Array2D<double> A(5, 5);
A[0][0] = 7.0; A[0][1] = 4.0; A[0][2] = 1.0; A[0][3] = 8.0; A[0][4] = 3.0;
A[1][0] = 1.0; A[1][1] = 8.0; A[1][2] = 6.0; A[1][3] = 5.0; A[1][4] = 8.0;
A[2][0] = 4.0; A[2][1] = 2.0; A[2][2] = 7.0; A[2][3] = 0.0; A[2][4] = 1.0;
A[3][0] = 3.0; A[3][1] = 7.0; A[3][2] = 5.0; A[3][3] = 1.0; A[3][4] = 1.0;
A[4][0] = 2.0; A[4][1] = 5.0; A[4][2] = 0.0; A[4][3] = 9.0; A[4][4] = 4.0;
std::cout << "A: " << std::endl;
std::cout << A << std::endl;

//2次元配列のコピー
TNT::Array2D<double> B = A.copy();
std::cout << "B: " << std::endl;
std::cout << B << std::endl;

//2次元配列の足し算
TNT::Array2D<double> C = A+B;
std::cout << "C: " << std::endl;
std::cout << C << std::endl;

//2次元配列の引き算
TNT::Array2D<double> D = A-B;
std::cout << "D: " << std::endl;
std::cout << D << std::endl;

//2次元配列の掛け算(要素同士の掛け算、行列の掛け算ではないので注意)
TNT::Array2D<double> E = A*B;
std::cout << "E: " << std::endl;
std::cout << E << std::endl;

//2次元配列の掛け算(行列の乗算)
TNT::Array2D<double> F=TNT::matmult(A,B);
std::cout << "F: " << std::endl;
std::cout << F << std::endl;

//1次元配列の定義
TNT::Array1D<double> b(5);
b[0] = 3.0;
b[1] = 1.0;
b[2] = 8.0;
b[3] = 4.0;
b[4] = 9.0;
std::cout << "b: " << std::endl;
std::cout << b << std::endl;

//1次元配列、成分同士の掛け算
std::cout << "b*b " << std::endl;
std::cout << b*b << std::endl;

//LU分解により連立1次方程式を解く
JAMA::LU<double> lu(A);
std::cout << "solve: " << std::endl;
std::cout << lu.solve(b) << std::endl;

//LU分解の結果表示、L、U、行列式
std::cout << lu.getL() << std::endl;
std::cout << lu.getU() << std::endl;
std::cout << lu.det() << std::endl;

//2次元配列(単位行列)
TNT::Array2D<double> I(5, 5);
I[0][0] = 1.0; I[0][1] = 0.0; I[0][2] = 0.0; I[0][3] = 0.0; I[0][4] = 0.0;
I[1][0] = 0.0; I[1][1] = 1.0; I[1][2] = 0.0; I[1][3] = 0.0; I[1][4] = 0.0;
I[2][0] = 0.0; I[2][1] = 0.0; I[2][2] = 1.0; I[2][3] = 0.0; I[2][4] = 0.0;
I[3][0] = 0.0; I[3][1] = 0.0; I[3][2] = 0.0; I[3][3] = 1.0; I[3][4] = 0.0;
I[4][0] = 0.0; I[4][1] = 0.0; I[4][2] = 0.0; I[4][3] = 0.0; I[4][4] = 1.0;
std::cout << "I: " << std::endl;
std::cout << I << std::endl;

//LU分解により逆行列を求める。(単位行列に対して解く)
JAMA::LU<double> lu2(B);
TNT::Array2D<double> invB=lu2.solve(I);
std::cout << "solve: " << std::endl;
std::cout << invB << std::endl;

//逆行列の確認
std::cout << "B*inv(B): " << std::endl;
std::cout << TNT::matmult(B,invB) << std::endl;

//行列の定義
TNT::Matrix<double> G(5, 5);
G[0][0] = 7.0; G[0][1] = 4.0; G[0][2] = 1.0; G[0][3] = 8.0; G[0][4] = 3.0;
G[1][0] = 1.0; G[1][1] = 8.0; G[1][2] = 6.0; G[1][3] = 5.0; G[1][4] = 8.0;
G[2][0] = 4.0; G[2][1] = 2.0; G[2][2] = 7.0; G[2][3] = 0.0; G[2][4] = 1.0;
G[3][0] = 3.0; G[3][1] = 7.0; G[3][2] = 5.0; G[3][3] = 1.0; G[3][4] = 1.0;
G[4][0] = 2.0; G[4][1] = 5.0; G[4][2] = 0.0; G[4][3] = 9.0; G[4][4] = 4.0;

std::cout << "G " << std::endl;
std::cout << G << std::endl;

//行列の転置
std::cout << "G' " << std::endl;
std::cout << TNT::transpose(G) << std::endl;

//ベクトルの定義
TNT::Vector<double> g(5);
g[0] = 3.0;
g[1] = 1.0;
g[2] = 8.0;
g[3] = 4.0;
g[4] = 9.0;

//行列×ベクトル演算
std::cout << "G*g: " << std::endl;
std::cout << TNT::matmult(G,g) << std::endl;

//ベクトル内積
std::cout << "g'*g: " << std::endl;
std::cout << dot_prod(g,g) << std::endl;

return 0;
}

スポンサーサイト

コメントの投稿

非公開コメント

カレンダー
10 | 2017/11 | 12
- - - 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
26 27 28 29 30 - -
プロフィール

uglab

Author:uglab
ソフト開発会社

【Twitter】
フォローお願いします

【You tube動画一覧】
チャンネル登録お願いします


最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
スポンサードリンク
    【スポンサードリンク】

リンク
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。