色々合って自分でLU分解しなければならなくなりました.
行列方程式の解を求めたいのですが,諸事情により,よく使ってた便利なOpenCVの関数を使えないということなのです.
いい勉強の機会だと思い,まずはLU分解の勉強.
線形代数とその応用という本で勉強したのですが,こいつがとんでもなく良い本ですね.
こういう語り口調でわかりやすい本は大好きです.
とりあえず仕組みは分かった.じゃあ分かりやすいソースコードがどこかに無いかなーと探すw
読みやすいソースコードを発見した.
神奈川大学の内田先生の公開コードを参照させていただきました.当該コードの著作権は内田先生に帰属します.参照元: http://www.inf.ie.kanagawa-u.ac.jp/c_learn/index.html#ouyou
よって私が改変した以下のコードはその二次的著作物となります.
上記コードではピボット選択をしない仕様でしたので,改変しできるようにしました.これで特異でない行列を含む行列方程式なら解を導出できることになります.
pivotが0の時のよさげなpivotを探して行を交換.それに伴いL行列も更新する.という操作を加えただけなんですが.
改変した主要な部分はLUpivot()とLUsolve()を加えた点です.うごかねーぞこら!ということに関して一切責任を負いかねます.もし参照するなら自己責任でお願いします.
いやはやエラー処理があまりに適当すぎるのが難点…
main.c
LUutil.h
LUutil.c
あぁ,何とかできた.てかこれくらいのコードもっとちゃちゃっとかけるようになりたいわ.
行列方程式の解を求めたいのですが,諸事情により,よく使ってた便利なOpenCVの関数を使えないということなのです.
いい勉強の機会だと思い,まずはLU分解の勉強.
線形代数とその応用という本で勉強したのですが,こいつがとんでもなく良い本ですね.
こういう語り口調でわかりやすい本は大好きです.
とりあえず仕組みは分かった.じゃあ分かりやすいソースコードがどこかに無いかなーと探すw
読みやすいソースコードを発見した.
神奈川大学の内田先生の公開コードを参照させていただきました.当該コードの著作権は内田先生に帰属します.参照元: http://www.inf.ie.kanagawa-u.ac.jp/c_learn/index.html#ouyou
よって私が改変した以下のコードはその二次的著作物となります.
上記コードではピボット選択をしない仕様でしたので,改変しできるようにしました.これで特異でない行列を含む行列方程式なら解を導出できることになります.
pivotが0の時のよさげなpivotを探して行を交換.それに伴いL行列も更新する.という操作を加えただけなんですが.
改変した主要な部分はLUpivot()とLUsolve()を加えた点です.うごかねーぞこら!ということに関して一切責任を負いかねます.もし参照するなら自己責任でお願いします.
いやはやエラー処理があまりに適当すぎるのが難点…
main.c
#include
|
LUutil.h
#define MAX_DIM 10 /* 次数の最大値 */
#define MIN_DIM 1 /* 次数の最小値 */
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
void MulMatandVec(double result[], double matA[], double vecB[], int size);
extern int get_dimension( int max, int min );
double *get_matrix( int n );
double *get_vector( int n );
void set_matrix( int n, double *a );
void set_vector( int n, double *b );
void mswap( double *a, double *b );
void LU( int n, double *a, double *l, double *u );
int LUsolve( int n, double *x, double *A, double *b );
int LUpivot( int n, double *a, double *b, double *l, double *u );
void L_equ( int n, double *l, double *c, double *b );
void U_equ( int n, double *u, double *x, double *c );
void pr_vector( int n, double *b );
void matrixcpy( int n, double *u, double *a );
void make_I( int n, double *l );
|
LUutil.c
#pragma once
#include
|
あぁ,何とかできた.てかこれくらいのコードもっとちゃちゃっとかけるようになりたいわ.
0 件のコメント:
コメントを投稿