データ構造 | |
struct | FMATRIX |
行列 [詳細] | |
struct | FVECTOR |
ベクトル [詳細] | |
関数 | |
FMATRIX *FVALGAPI | fnFIE_mat_aalloc (INT row, INT col) |
行列の生成 | |
INT FVALGAPI | fnFIE_mat_arealloc (FMATRIX *a, INT row, INT col) |
行列次元の変更 | |
VOID FVALGAPI | fnFIE_mat_afree (FMATRIX *a) |
行列の解放 | |
FVECTOR *FVALGAPI | fnFIE_mat_valloc (INT dim) |
ベクトルの生成 | |
INT FVALGAPI | fnFIE_mat_vrealloc (FVECTOR *vect, INT dim) |
ベクトルの次元変更 | |
VOID FVALGAPI | fnFIE_mat_vfree (FVECTOR *vect) |
ベクトル領域の解放 | |
INT FVALGAPI | fnFIE_mat_vinit (FVECTOR *vect) |
vectorの初期化 | |
INT FVALGAPI | fnFIE_mat_vinit_val (FVECTOR *vect, DOUBLE val) |
vectorの初期化(初期化値付き) | |
INT FVALGAPI | fnFIE_mat_ainit (FMATRIX *a) |
行列の初期化 | |
INT FVALGAPI | fnFIE_mat_ainit_val (FMATRIX *a, DOUBLE val) |
行列の初期化(初期化値付き) | |
INT FVALGAPI | fnFIE_mat_copy (const FMATRIX *a1, FMATRIX *a2) |
行列の複写 | |
INT FVALGAPI | fnFIE_mat_copy_to_img (const FMATRIX *a, FHANDLE hdst) |
行列から画像への複写 | |
INT FVALGAPI | fnFIE_mat_copy_from_img (const FHANDLE hsrc, FMATRIX *a) |
画像から行列への複写 | |
INT FVALGAPI | fnFIE_mat_vcopy (const FVECTOR *v1, FVECTOR *v2) |
ベクトルの複写 | |
INT FVALGAPI | fnFIE_mat_eye (FMATRIX *a) |
単位行列の作成 | |
INT FVALGAPI | fnFIE_mat_ones (FMATRIX *a) |
要素が全て1の行列の作成 | |
INT FVALGAPI | fnFIE_mat_zeros (FMATRIX *a) |
要素が全て0の行列の作成 | |
INT FVALGAPI | fnFIE_mat_aduplicate (const FMATRIX *src, FMATRIX **dst) |
行列の複製 | |
INT FVALGAPI | fnFIE_mat_aread (FMATRIX **mat, fvstream *stream, INT *size) |
ストリームからの行列読込 | |
INT FVALGAPI | fnFIE_mat_awrite (const FMATRIX *mat, fvstream *stream, INT *size) |
行列のストリームへの書込 | |
INT FVALGAPI | fnFIE_mat_vread (FVECTOR **vec, fvstream *stream, INT *size) |
ストリームからのベクトル読込 | |
INT FVALGAPI | fnFIE_mat_vwrite (const FVECTOR *vec, fvstream *stream, INT *size) |
ベクトルのストリームへの書込 | |
INT FVALGAPI | fnFIE_mat_triu (const FMATRIX *a, FMATRIX *ad, INT k) |
上三角成分の抽出 | |
INT FVALGAPI | fnFIE_mat_tril (const FMATRIX *a, FMATRIX *ad, INT k) |
下三角成分の抽出 | |
INT FVALGAPI | fnFIE_mat_circshift (const FMATRIX *a, FMATRIX *ad, INT sx, INT sy) |
行列要素の循環シフト | |
INT FVALGAPI | fnFIE_mat_horzcat (const FMATRIX *a1, const FMATRIX *a2, FMATRIX *ad) |
行列要素の水平方向結合 | |
INT FVALGAPI | fnFIE_mat_vertcat (const FMATRIX *a1, const FMATRIX *a2, FMATRIX *ad) |
行列要素の垂直方向結合 | |
INT FVALGAPI | fnFIE_mat_flipdim (const FMATRIX *a, FMATRIX *ad, INT mode) |
行列要素の反転 | |
INT FVALGAPI | fnFIE_mat_rand (FMATRIX *a) |
![]() |
FMATRIX* FVALGAPI fnFIE_mat_aalloc | ( | INT | row, | |
INT | col | |||
) |
行列の生成
指定次元の行列に必要なメモリ確保を行い、生成した行列を返します。 確保する行列のサイズは row * col < を満たすように指定 しなければいけません。
[in] | row | 確保する行列の行数 |
[in] | col | 確保する行列の列数 |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" INT main() { FMATRIX *a=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); // 3x3行列a を確保 a = fnFIE_mat_aalloc( 3, 3 ); // a を10x10行列にリサイズ fnFIE_mat_arealloc( a, 10, 10 ); fnFIE_mat_afree( a ); // 終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_mat_arealloc | ( | FMATRIX * | a, | |
INT | row, | |||
INT | col | |||
) |
行列次元の変更
すでに確保済みの行列の次元を変更します。 変更に成功した場合、元の値は保存されません。 変更後の行列のサイズは row * col < を 満たすように指定しなければいけません。 本関数に渡される行列 a は fnFIE_mat_aalloc() によって 確保されたものでなければなりません。
メモリ確保に失敗した場合は F_ERR_NOMEMORY を返しますが、 変更前の元の行列は保持されたままになります。 この場合は fnFIE_mat_afree() にて解放する必要があります。
[in,out] | a | 次元を変更する行列 |
[in] | row | 変更後の行列の行数 |
[in] | col | 変更後の行列の列数 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正(a==NULL,row,colが不正) | |
F_ERR_NOMEMORY | メモリ不足エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" INT main() { FMATRIX *a=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); // 3x3行列a を確保 a = fnFIE_mat_aalloc( 3, 3 ); // a を10x10行列にリサイズ fnFIE_mat_arealloc( a, 10, 10 ); fnFIE_mat_afree( a ); // 終了処理 fnFIE_teardown(); return 0; }
VOID FVALGAPI fnFIE_mat_afree | ( | FMATRIX * | a | ) |
行列の解放
行列を解放します。 本関数に渡される行列 a は fnFIE_mat_aalloc() によって 確保されたものでなければなりません。
[in] | a | 解放する配列 |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" INT main() { FMATRIX *a=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); // 3x3行列a を確保 a = fnFIE_mat_aalloc( 3, 3 ); // a を10x10行列にリサイズ fnFIE_mat_arealloc( a, 10, 10 ); fnFIE_mat_afree( a ); // 終了処理 fnFIE_teardown(); return 0; }
FVECTOR* FVALGAPI fnFIE_mat_valloc | ( | INT | dim | ) |
ベクトルの生成
ベクトルに必要なメモリを確保し、生成したベクトルを返します。
[in] | dim | ベクトルの次元(要素数) (0 < dim < 2^29) |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" INT main() { FVECTOR *v=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); // 次元3のベクトル v を確保 v = fnFIE_mat_valloc( 3 ); // v を次元10にリサイズ fnFIE_mat_vrealloc( v, 10 ); fnFIE_mat_vfree( v ); // 終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_mat_vrealloc | ( | FVECTOR * | vect, | |
INT | dim | |||
) |
ベクトルの次元変更
既に確保済みのベクトルの次元を変更します。 変更に成功した場合、元の値は保存されません。 メモリ確保に失敗した場合は F_ERR_NOMEMORY を返しますが、 元の行列は保持されています。 この場合は fnFIE_mat_vfree() にて解放する必要があります。
[in,out] | vect | 次元変更をするベクトル |
[in] | dim | 変更後のベクトルの次元(要素数) (0 < dim < 2^29) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正(vect==NULL, dimが不正) | |
F_ERR_NOMEMORY | メモリ不足エラー | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" INT main() { FVECTOR *v=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); // 次元3のベクトル v を確保 v = fnFIE_mat_valloc( 3 ); // v を次元10にリサイズ fnFIE_mat_vrealloc( v, 10 ); fnFIE_mat_vfree( v ); // 終了処理 fnFIE_teardown(); return 0; }
VOID FVALGAPI fnFIE_mat_vfree | ( | FVECTOR * | vect | ) |
ベクトル領域の解放
確保済みのベクトルを解放します。
[in] | vect | 解放するベクトル |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" INT main() { FVECTOR *v=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); // 次元3のベクトル v を確保 v = fnFIE_mat_valloc( 3 ); // v を次元10にリサイズ fnFIE_mat_vrealloc( v, 10 ); fnFIE_mat_vfree( v ); // 終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_mat_vinit | ( | FVECTOR * | vect | ) |
vectorの初期化
ベクトルの要素を全て0.0に初期化します。
[in,out] | vect | 初期化するベクトル |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_mat_vinit_val | ( | FVECTOR * | vect, | |
DOUBLE | val | |||
) |
vectorの初期化(初期化値付き)
ベクトルの要素を全て val に初期化します。
[in,out] | vect | 初期化するベクトル |
[in] | val | 初期化値 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_mat_ainit | ( | FMATRIX * | a | ) |
行列の初期化
行列の要素を全て0.0に初期化します。 本関数と fnFIE_mat_zeros は同じ動作をします。
[in,out] | a | 初期化したい行列 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_mat_ainit_val | ( | FMATRIX * | a, | |
DOUBLE | val | |||
) |
行列の初期化(初期化値付き)
行列の要素を全て指定値 val に初期化します。
[in,out] | a | 初期化したい行列 |
[in] | val | 初期化値 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
行列の複写
行列1(a1)から、行列2(a2)に内容を複写します。 a2 の次元が a1 と違っていた場合は、エラーになります。
[in] | a1 | 行列1(コピー元行列) |
[out] | a2 | 行列2(コピー先行列) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_mat_copy_to_img | ( | const FMATRIX * | a, | |
FHANDLE | hdst | |||
) |
行列から画像への複写
行列 a から、画像 hdst に内容を複写します。 コピー元行列とコピー先画像は以下の条件を満たしている必要があります。
対応する hdst の画像型は F_IMG_UC8、F_IMG_US16、F_IMG_S16、F_IMG_FLOAT、F_IMG_DOUBLE です。
コピー先画像の型が F_IMG_DOUBLE の場合、元の行列の値がそのままコピーされます。
そうでない場合は、行列 a が画像型 F_IMG_DOUBLE の画像であるとみなした際の fnFIE_img_copy() の動作に準じます。
[in] | a | コピー元行列 |
[out] | hdst | コピー先画像 (type: uc8, s16, us16, float, double / ch: 1) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_INVALID_IMAGE | 不正な画像エラー | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_mat_copy_from_img | ( | const FHANDLE | hsrc, | |
FMATRIX * | a | |||
) |
画像から行列への複写
画像 hsrc から、行列 a に内容を複写します。 コピー元画像とコピー先行列は以下の条件を満たしている必要があります。
対応する hsrc の画像型は F_IMG_UC8、F_IMG_US16、F_IMG_S16、F_IMG_FLOAT、F_IMG_DOUBLE です。
コピー元画像の型が F_IMG_DOUBLE の場合、元の画像の濃淡値がそのままコピーされます。
そうでない場合は、行列 a が画像型 F_IMG_DOUBLE の画像であるとみなした際の fnFIE_img_copy() の動作に準じます。
[in] | hsrc | コピー元画像 (type: uc8, s16, us16, float, double / ch: 1) |
[out] | a | コピー先行列 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_INVALID_IMAGE | 不正な画像エラー | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
ベクトルの複写
ベクトル1(v1)から、ベクトル2(v2)に内容を複写します。 v2 の次元が v1 と違っていた場合は、エラーになります。
[in] | v1 | ベクトル1(コピー元ベクトル) |
[out] | v2 | ベクトル2(コピー先ベクトル) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_mat_eye | ( | FMATRIX * | a | ) |
単位行列の作成
入力された正方行列の値を単位行列に設定します。 対角成分が 1.0 になり、他の成分は 0.0 になります。
[in,out] | a | 値を設定する行列 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正終了 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_mat_ones | ( | FMATRIX * | a | ) |
要素が全て1の行列の作成
入力された行列の成分を全て 1.0 に設定します。
[in,out] | a | 値を設定する行列 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正終了 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_mat_zeros | ( | FMATRIX * | a | ) |
要素が全て0の行列の作成
入力された行列の成分を全て 0.0 に設定します。 本関数は fnFIE_mat_ainit() のエイリアスであり、 同じ動作をします。
[in,out] | a | 値を設定する行列 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正終了 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
行列の複製
行列 src と同じ内容の行列 *dst を生成します。
本関数は、内部で fnFIE_mat_aalloc() にて src と同じサイズの行列を生成し、 fnFIE_mat_copy() にて内容をコピーします。 正常終了すると *dst には複製された行列が格納されます。 *dst が不要になったら fnFIE_mat_afree() にて解放してください。
[in] | src | コピー元行列 |
[out] | dst | コピーされた行列 関数エントリー時 *dst == NULL でなければなりません。 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー | |
F_ERR_NOMEMORY | メモリ不足エラー |
ストリームからの行列読込
指定されたストリーム fvstream stream から行列を読み込みます。 入力されるストリームは fnFIE_mat_awrite() にて出力されたものでなければなりません。 ストリームの仕様は fnFIE_mat_awrite() のドキュメントを参照してください。
正常に読込が行われた場合 *mat には読み込んだ行列のポインタが格納されます。 ただし、ストリームに NULL FMATRIX が格納されていた場合は *mat には NULL が 格納されます。
[out] | mat | 読み込んだ行列のポインタのポインタ。 |
[in] | stream | 読み込むストリーム |
[out] | size | ストリームから読み込まれたサイズ(バイト単位)。 不要な場合はNULLを指定可能です。 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータエラー | |
F_ERR_FILE_IO | ストリームエラー | |
F_ERR_NOMEMORY | メモリ不足エラー | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
行列のストリームへの書込
指定されたストリーム fvstream stream へ行列を書き込みます。 出力したストリームは fnFIE_mat_aread() にて読み込むことができます。
stream にNULLをした場合、本関数は指定された mat の書込に必用な サイズを計算し(バイト単位) *size に代入して終了します。
offset type mean --------------------------------------------------------------- +0 UCHAR*4 chunk header. (=='FDAT') +4 UCHAR*4 type id (=='0002') +8 INT size +12 INT format version (1) +16 INT 1 (is null object?)mat != NULL の場合
offset type mean --------------------------------------------------------------- +0 UCHAR*4 chunk header. (=='FDAT') +4 UCHAR*4 type id (=='0002') +8 INT size +12 INT format version (1) +16 INT 0 (is null object?) +20 INT row +24 INT col +28+8*X DOUBLE*X elements
[in] | mat | 書き込む行列のポインタ |
[out] | stream | 書き込むストリーム |
[out] | size | ストリームへ書き込まれたサイズ(バイト単位)。 不要な場合はNULLを指定可能です。 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータエラー | |
F_ERR_FILE_IO | ストリームエラー | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
ストリームからのベクトル読込
指定されたストリーム fvstream stream からベクトルを読み込みます。 入力されるストリームは fnFIE_mat_vwrite() にて出力されたものでなければなりません。
正常に読込が行われた場合 *vec には読み込んだベクトルのポインタが格納されます。 ただし、ストリームに NULL FVECTOR が格納されていた場合は *vec には NULL が 格納されます。
[out] | vec | 読み込んだベクトルのポインタのポインタ。 関数エントリー時 *vec はNULLで無ければなりません。 |
[in] | stream | 読み込むストリーム |
[out] | size | ストリームから読み込まれたサイズ(バイト単位)。 不要な場合はNULLを指定可能です。 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータエラー | |
F_ERR_FILE_IO | ストリームエラー | |
F_ERR_NOMEMORY | メモリ不足エラー | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
ベクトルのストリームへの書込
指定されたストリーム fvstream stream へベクトルを書き込みます。 出力したストリームは fnFIE_mat_vread() にて読み込むことができます。
stream にNULLをした場合、本関数は指定された vec の書込に 必用なサイズを計算し *size に代入して終了します。
offset type mean --------------------------------------------------------------- +0 UCHAR*4 chunk header. (=='FDAT') +4 UCHAR*4 type id (=='0001', ascii radix=16) +8 INT size +12 INT format version (1) +16 INT 1 (is null object?)vec != NULL の場合
offset type mean --------------------------------------------------------------- +0 UCHAR*4 chunk header. (=='FDAT') +4 UCHAR*4 type id (=='0001', ascii radix=16) +8 INT size +12 INT format version (1) +16 INT 0 (is null object?) +20 INT dimension +24+8*X DOUBLE*X elements
[in] | vec | 書き込むベクトルのポインタ |
[out] | stream | 書き込むストリーム |
[out] | size | ストリームへ書き込まれたサイズ(バイト単位)。 不要な場合はNULLを指定可能です。 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータエラー | |
F_ERR_FILE_IO | ストリームエラー | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
上三角成分の抽出
MxN行列 A の上三角部を取り出し ad に出力します。
ad の対角成分を除く下三角部は 0 が格納されます。
k は対角位置を指定するパラメータで、k=0は主対角を示します。 k>0のとき主対角よりも上側の対角を、k<0のとき主対角成分より下側の対角を示します。 と指定した場合、エラーとなります。
a と ad は同じポインタを渡すことが出来ます。
[in] | a | MxN入力行列A |
[out] | ad | MxN行列。aの上三角要素が格納される。 |
[in] | k | 対角位置 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include <stdio.h> #include "fie.h" static VOID mat_print( FMATRIX *a ) { INT i,j; for( j=0; j<a->row; j++ ){ printf( " [ " ); for( i=0; i<a->col; i++ ){ printf( "%+0.6e ", a->m[j][i] ); } printf( "]\n" ); } printf( "\n" ); } INT main() { FMATRIX *a=NULL, *b=NULL, *c=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); a = fnFIE_mat_aalloc( 4, 4 ); // 4x4行列 a を確保 b = fnFIE_mat_aalloc( 4, 4 ); // 4x4行列 b を確保 // 入力値をセット a->m[0][0] = 1.0; a->m[0][1] = 3.0; a->m[0][2] = 3.0; a->m[0][3] = 9.0; a->m[1][0] = 4.0; a->m[1][1] =-2.0; a->m[1][2] = 1.0; a->m[1][3] = 3.0; a->m[2][0] = 6.0; a->m[2][1] =-4.0; a->m[2][2] = 8.0; a->m[2][3] = 5.0; a->m[3][0] =-2.0; a->m[3][1] = 3.0; a->m[3][2] =-7.0; a->m[3][3] = 3.0; printf( "a =\n" ); mat_print( a ); // 上三角行列を取得 fnFIE_mat_triu( a, b, 0 ); printf( "triu(a,0) =\n" ); mat_print( b ); fnFIE_mat_triu( a, b, 1 ); printf( "triu(a,1) =\n" ); mat_print( b ); // 下三角行列を取得 fnFIE_mat_tril( a, b, 0 ); printf( "tril(a,0) =\n" ); mat_print( b ); fnFIE_mat_tril( a, b, 1 ); printf( "tril(a,1) =\n" ); mat_print( b ); fnFIE_mat_afree( a ); fnFIE_mat_afree( b ); // 終了処理 fnFIE_teardown(); return 0; } /* 結果 a = [ +1.000000e+000 +3.000000e+000 +3.000000e+000 +9.000000e+000 ] [ +4.000000e+000 -2.000000e+000 +1.000000e+000 +3.000000e+000 ] [ +6.000000e+000 -4.000000e+000 +8.000000e+000 +5.000000e+000 ] [ -2.000000e+000 +3.000000e+000 -7.000000e+000 +3.000000e+000 ] triu(a,0) = [ +1.000000e+000 +3.000000e+000 +3.000000e+000 +9.000000e+000 ] [ +0.000000e+000 -2.000000e+000 +1.000000e+000 +3.000000e+000 ] [ +0.000000e+000 +0.000000e+000 +8.000000e+000 +5.000000e+000 ] [ +0.000000e+000 +0.000000e+000 +0.000000e+000 +3.000000e+000 ] triu(a,1) = [ +0.000000e+000 +3.000000e+000 +3.000000e+000 +9.000000e+000 ] [ +0.000000e+000 +0.000000e+000 +1.000000e+000 +3.000000e+000 ] [ +0.000000e+000 +0.000000e+000 +0.000000e+000 +5.000000e+000 ] [ +0.000000e+000 +0.000000e+000 +0.000000e+000 +0.000000e+000 ] tril(a,0) = [ +1.000000e+000 +0.000000e+000 +0.000000e+000 +0.000000e+000 ] [ +4.000000e+000 -2.000000e+000 +0.000000e+000 +0.000000e+000 ] [ +6.000000e+000 -4.000000e+000 +8.000000e+000 +0.000000e+000 ] [ -2.000000e+000 +3.000000e+000 -7.000000e+000 +3.000000e+000 ] tril(a,1) = [ +1.000000e+000 +3.000000e+000 +0.000000e+000 +0.000000e+000 ] [ +4.000000e+000 -2.000000e+000 +1.000000e+000 +0.000000e+000 ] [ +6.000000e+000 -4.000000e+000 +8.000000e+000 +5.000000e+000 ] [ -2.000000e+000 +3.000000e+000 -7.000000e+000 +3.000000e+000 ] */
下三角成分の抽出
MxN行列 A の下三角部を取り出し ad に出力します。
ad の対角成分を除く上三角部は 0 が格納されます。
k は対角位置を指定するパラメータで、k=0は主対角を示します。 k>0のとき主対角よりも上側の対角を、k<0のとき主対角成分より下側の対角を示します。 と指定した場合、エラーとなります。
a と ad は同じポインタを渡すことが出来ます。
[in] | a | MxN入力行列A |
[out] | ad | MxN行列。aの下三角要素が格納される。 |
[in] | k | 対角位置 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include <stdio.h> #include "fie.h" static VOID mat_print( FMATRIX *a ) { INT i,j; for( j=0; j<a->row; j++ ){ printf( " [ " ); for( i=0; i<a->col; i++ ){ printf( "%+0.6e ", a->m[j][i] ); } printf( "]\n" ); } printf( "\n" ); } INT main() { FMATRIX *a=NULL, *b=NULL, *c=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); a = fnFIE_mat_aalloc( 4, 4 ); // 4x4行列 a を確保 b = fnFIE_mat_aalloc( 4, 4 ); // 4x4行列 b を確保 // 入力値をセット a->m[0][0] = 1.0; a->m[0][1] = 3.0; a->m[0][2] = 3.0; a->m[0][3] = 9.0; a->m[1][0] = 4.0; a->m[1][1] =-2.0; a->m[1][2] = 1.0; a->m[1][3] = 3.0; a->m[2][0] = 6.0; a->m[2][1] =-4.0; a->m[2][2] = 8.0; a->m[2][3] = 5.0; a->m[3][0] =-2.0; a->m[3][1] = 3.0; a->m[3][2] =-7.0; a->m[3][3] = 3.0; printf( "a =\n" ); mat_print( a ); // 上三角行列を取得 fnFIE_mat_triu( a, b, 0 ); printf( "triu(a,0) =\n" ); mat_print( b ); fnFIE_mat_triu( a, b, 1 ); printf( "triu(a,1) =\n" ); mat_print( b ); // 下三角行列を取得 fnFIE_mat_tril( a, b, 0 ); printf( "tril(a,0) =\n" ); mat_print( b ); fnFIE_mat_tril( a, b, 1 ); printf( "tril(a,1) =\n" ); mat_print( b ); fnFIE_mat_afree( a ); fnFIE_mat_afree( b ); // 終了処理 fnFIE_teardown(); return 0; } /* 結果 a = [ +1.000000e+000 +3.000000e+000 +3.000000e+000 +9.000000e+000 ] [ +4.000000e+000 -2.000000e+000 +1.000000e+000 +3.000000e+000 ] [ +6.000000e+000 -4.000000e+000 +8.000000e+000 +5.000000e+000 ] [ -2.000000e+000 +3.000000e+000 -7.000000e+000 +3.000000e+000 ] triu(a,0) = [ +1.000000e+000 +3.000000e+000 +3.000000e+000 +9.000000e+000 ] [ +0.000000e+000 -2.000000e+000 +1.000000e+000 +3.000000e+000 ] [ +0.000000e+000 +0.000000e+000 +8.000000e+000 +5.000000e+000 ] [ +0.000000e+000 +0.000000e+000 +0.000000e+000 +3.000000e+000 ] triu(a,1) = [ +0.000000e+000 +3.000000e+000 +3.000000e+000 +9.000000e+000 ] [ +0.000000e+000 +0.000000e+000 +1.000000e+000 +3.000000e+000 ] [ +0.000000e+000 +0.000000e+000 +0.000000e+000 +5.000000e+000 ] [ +0.000000e+000 +0.000000e+000 +0.000000e+000 +0.000000e+000 ] tril(a,0) = [ +1.000000e+000 +0.000000e+000 +0.000000e+000 +0.000000e+000 ] [ +4.000000e+000 -2.000000e+000 +0.000000e+000 +0.000000e+000 ] [ +6.000000e+000 -4.000000e+000 +8.000000e+000 +0.000000e+000 ] [ -2.000000e+000 +3.000000e+000 -7.000000e+000 +3.000000e+000 ] tril(a,1) = [ +1.000000e+000 +3.000000e+000 +0.000000e+000 +0.000000e+000 ] [ +4.000000e+000 -2.000000e+000 +1.000000e+000 +0.000000e+000 ] [ +6.000000e+000 -4.000000e+000 +8.000000e+000 +5.000000e+000 ] [ -2.000000e+000 +3.000000e+000 -7.000000e+000 +3.000000e+000 ] */
行列要素の循環シフト
行列Aの要素を sx, sy で指定された分だけ循環的にシフトします。
sx が正の場合、右方向へシフトし、負の場合、左方向へシフトします。 sy が正の場合、下方向へシフトし、負の場合、上方向へシフトします。
a と ad は同じポインタを渡すことは出来ません。 正しい結果が得られないことがあります。
[in] | a | MxN入力行列A |
[out] | ad | シフトされたMxN行列 |
[in] | sx | 列方向循環シフト量 |
[in] | sy | 行方向循環シフト量 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include <stdio.h> #include "fie.h" static VOID mat_print( FMATRIX *a ) { INT i,j; for( j=0; j<a->row; j++ ){ printf( " [ " ); for( i=0; i<a->col; i++ ){ printf( "%+0.6e ", a->m[j][i] ); } printf( "]\n" ); } printf( "\n" ); } INT main() { FMATRIX *a=NULL, *b=NULL, *c=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); a = fnFIE_mat_aalloc( 4, 4 ); // 4x4行列 a を確保 b = fnFIE_mat_aalloc( 4, 4 ); // 4x4行列 b を確保 // 入力値をセット a->m[0][0] = 1.0; a->m[0][1] = 5.0; a->m[0][2] = 9.0; a->m[0][3] =13.0; a->m[1][0] = 2.0; a->m[1][1] = 6.0; a->m[1][2] =10.0; a->m[1][3] =14.0; a->m[2][0] = 3.0; a->m[2][1] = 7.0; a->m[2][2] =11.0; a->m[2][3] =15.0; a->m[3][0] = 4.0; a->m[3][1] = 8.0; a->m[3][2] =12.0; a->m[3][3] =16.0; printf( "a =\n" ); mat_print( a ); // x シフト fnFIE_mat_circshift( a, b, 1, 0 ); printf( "circshift(a,sx=>1,sy=>0) =\n" ); mat_print( b ); fnFIE_mat_circshift( a, b, -1, 0 ); printf( "circshift(a,sx=>-1,sy=>0) =\n" ); mat_print( b ); // y シフト fnFIE_mat_circshift( a, b, 0, 1 ); printf( "circshift(a,sx=>0,sy=>1) =\n" ); mat_print( b ); fnFIE_mat_circshift( a, b, 0, -1 ); printf( "circshift(a,sx=>0,sy=>-1) =\n" ); mat_print( b ); fnFIE_mat_afree( a ); fnFIE_mat_afree( b ); // 終了処理 fnFIE_teardown(); return 0; } /* 結果 a = [ +1.000000e+000 +5.000000e+000 +9.000000e+000 +1.300000e+001 ] [ +2.000000e+000 +6.000000e+000 +1.000000e+001 +1.400000e+001 ] [ +3.000000e+000 +7.000000e+000 +1.100000e+001 +1.500000e+001 ] [ +4.000000e+000 +8.000000e+000 +1.200000e+001 +1.600000e+001 ] circshift(a,sx=>1,sy=>0) = [ +1.300000e+001 +1.000000e+000 +5.000000e+000 +9.000000e+000 ] [ +1.400000e+001 +2.000000e+000 +6.000000e+000 +1.000000e+001 ] [ +1.500000e+001 +3.000000e+000 +7.000000e+000 +1.100000e+001 ] [ +1.600000e+001 +4.000000e+000 +8.000000e+000 +1.200000e+001 ] circshift(a,sx=>-1,sy=>0) = [ +5.000000e+000 +9.000000e+000 +1.300000e+001 +1.000000e+000 ] [ +6.000000e+000 +1.000000e+001 +1.400000e+001 +2.000000e+000 ] [ +7.000000e+000 +1.100000e+001 +1.500000e+001 +3.000000e+000 ] [ +8.000000e+000 +1.200000e+001 +1.600000e+001 +4.000000e+000 ] circshift(a,sx=>0,sy=>1) = [ +4.000000e+000 +8.000000e+000 +1.200000e+001 +1.600000e+001 ] [ +1.000000e+000 +5.000000e+000 +9.000000e+000 +1.300000e+001 ] [ +2.000000e+000 +6.000000e+000 +1.000000e+001 +1.400000e+001 ] [ +3.000000e+000 +7.000000e+000 +1.100000e+001 +1.500000e+001 ] circshift(a,sx=>0,sy=>-1) = [ +2.000000e+000 +6.000000e+000 +1.000000e+001 +1.400000e+001 ] [ +3.000000e+000 +7.000000e+000 +1.100000e+001 +1.500000e+001 ] [ +4.000000e+000 +8.000000e+000 +1.200000e+001 +1.600000e+001 ] [ +1.000000e+000 +5.000000e+000 +9.000000e+000 +1.300000e+001 ] */
行列要素の水平方向結合
行列 a1 と 行列 a2 を水平方向に結合し、結合した行列 ad を出力します。
行列 a1 と 行列 a2 、及び 行列 ad の次元は次の条件をすべて満たしていなければいけません。
a1 と a2 は同じポインタを渡すことが出来ます。
[in] | a1 | 入力行列A1 |
[in] | a2 | 入力行列A2 |
[out] | ad | A1とA2を結合した行列 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include <stdio.h> #include "fie.h" static VOID mat_print( FMATRIX *a ) { INT i,j; for( j=0; j<a->row; j++ ){ printf( " [ " ); for( i=0; i<a->col; i++ ){ printf( "%+0.6e ", a->m[j][i] ); } printf( "]\n" ); } printf( "\n" ); } INT main() { FMATRIX *a=NULL, *b=NULL, *c=NULL, *d=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); a = fnFIE_mat_aalloc( 2, 2 ); // 2x2行列 a を確保 b = fnFIE_mat_aalloc( 2, 2 ); // 2x2行列 b を確保 c = fnFIE_mat_aalloc( 2, 4 ); // 2x4行列 c を確保 d = fnFIE_mat_aalloc( 4, 2 ); // 4x2行列 d を確保 // 入力値をセット a->m[0][0] = 1.0; a->m[0][1] = 5.0; a->m[1][0] = 2.0; a->m[1][1] = 6.0; b->m[0][0] = 3.0; b->m[0][1] = 7.0; b->m[1][0] = 4.0; b->m[1][1] = 8.0; printf( "a =\n" ); mat_print( a ); printf( "b =\n" ); mat_print( b ); // 水平方向結合 fnFIE_mat_horzcat( a, b, c ); printf( "horzcat(a,b) =\n" ); mat_print( c ); // 垂直方向結合 fnFIE_mat_vertcat( a, b, d ); printf( "vertcat(a,b) =\n" ); mat_print( d ); fnFIE_mat_afree( a ); fnFIE_mat_afree( b ); fnFIE_mat_afree( c ); fnFIE_mat_afree( d ); // 終了処理 fnFIE_teardown(); return 0; } /* 結果 a = [ +1.000000e+000 +5.000000e+000 ] [ +2.000000e+000 +6.000000e+000 ] b = [ +3.000000e+000 +7.000000e+000 ] [ +4.000000e+000 +8.000000e+000 ] horzcat(a,b) = [ +1.000000e+000 +5.000000e+000 +3.000000e+000 +7.000000e+000 ] [ +2.000000e+000 +6.000000e+000 +4.000000e+000 +8.000000e+000 ] vertcat(a,b) = [ +1.000000e+000 +5.000000e+000 ] [ +2.000000e+000 +6.000000e+000 ] [ +3.000000e+000 +7.000000e+000 ] [ +4.000000e+000 +8.000000e+000 ] */
行列要素の垂直方向結合
行列 a1 と 行列 a2 を垂直方向に結合し、結合した行列 ad を出力します。
行列 a1 と 行列 a2 、及び 行列 ad の次元は次の条件をすべて満たしていなければいけません。
a1 と a2 は同じポインタを渡すことが出来ます。
[in] | a1 | 入力行列A1 |
[in] | a2 | 入力行列A2 |
[out] | ad | A1とA2を結合した行列 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include <stdio.h> #include "fie.h" static VOID mat_print( FMATRIX *a ) { INT i,j; for( j=0; j<a->row; j++ ){ printf( " [ " ); for( i=0; i<a->col; i++ ){ printf( "%+0.6e ", a->m[j][i] ); } printf( "]\n" ); } printf( "\n" ); } INT main() { FMATRIX *a=NULL, *b=NULL, *c=NULL, *d=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); a = fnFIE_mat_aalloc( 2, 2 ); // 2x2行列 a を確保 b = fnFIE_mat_aalloc( 2, 2 ); // 2x2行列 b を確保 c = fnFIE_mat_aalloc( 2, 4 ); // 2x4行列 c を確保 d = fnFIE_mat_aalloc( 4, 2 ); // 4x2行列 d を確保 // 入力値をセット a->m[0][0] = 1.0; a->m[0][1] = 5.0; a->m[1][0] = 2.0; a->m[1][1] = 6.0; b->m[0][0] = 3.0; b->m[0][1] = 7.0; b->m[1][0] = 4.0; b->m[1][1] = 8.0; printf( "a =\n" ); mat_print( a ); printf( "b =\n" ); mat_print( b ); // 水平方向結合 fnFIE_mat_horzcat( a, b, c ); printf( "horzcat(a,b) =\n" ); mat_print( c ); // 垂直方向結合 fnFIE_mat_vertcat( a, b, d ); printf( "vertcat(a,b) =\n" ); mat_print( d ); fnFIE_mat_afree( a ); fnFIE_mat_afree( b ); fnFIE_mat_afree( c ); fnFIE_mat_afree( d ); // 終了処理 fnFIE_teardown(); return 0; } /* 結果 a = [ +1.000000e+000 +5.000000e+000 ] [ +2.000000e+000 +6.000000e+000 ] b = [ +3.000000e+000 +7.000000e+000 ] [ +4.000000e+000 +8.000000e+000 ] horzcat(a,b) = [ +1.000000e+000 +5.000000e+000 +3.000000e+000 +7.000000e+000 ] [ +2.000000e+000 +6.000000e+000 +4.000000e+000 +8.000000e+000 ] vertcat(a,b) = [ +1.000000e+000 +5.000000e+000 ] [ +2.000000e+000 +6.000000e+000 ] [ +3.000000e+000 +7.000000e+000 ] [ +4.000000e+000 +8.000000e+000 ] */
行列要素の反転
a を指定した次元に関して反転させた行列を返します。 mode=1のとき、行方向に上下反転させます。 mode=2のとき、列方向に左右反転させます。 a と ad の次元は等しくなければいけません。
a と ad は同じポインタを渡すことは出来ません。 正しい結果が得られません。
[in] | a | 入力行列 |
[out] | ad | 反転された行列 |
[in] | mode | 反転させる次元 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include <stdio.h> #include "fie.h" static VOID mat_print( FMATRIX *a ) { INT i,j; for( j=0; j<a->row; j++ ){ printf( " [ " ); for( i=0; i<a->col; i++ ){ printf( "%+0.6e ", a->m[j][i] ); } printf( "]\n" ); } printf( "\n" ); } INT main() { FMATRIX *a=NULL, *b=NULL; // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); a = fnFIE_mat_aalloc( 4, 4 ); // 4x4行列 a を確保 b = fnFIE_mat_aalloc( 4, 4 ); // 4x4行列 b を確保 // 入力値をセット a->m[0][0] = 1.0; a->m[0][1] = 5.0; a->m[0][2] = 9.0; a->m[0][3] =13.0; a->m[1][0] = 2.0; a->m[1][1] = 6.0; a->m[1][2] =10.0; a->m[1][3] =14.0; a->m[2][0] = 3.0; a->m[2][1] = 7.0; a->m[2][2] =11.0; a->m[2][3] =15.0; a->m[3][0] = 4.0; a->m[3][1] = 8.0; a->m[3][2] =12.0; a->m[3][3] =16.0; printf( "a =\n" ); mat_print( a ); // mode=1 fnFIE_mat_flipdim( a, b, 1 ); printf( "flipdim(a,mode=>1) =\n" ); mat_print( b ); // mode=2 fnFIE_mat_flipdim( a, b, 2 ); printf( "flipdim(a,mode=>2) =\n" ); mat_print( b ); fnFIE_mat_afree( a ); fnFIE_mat_afree( b ); // 終了処理 fnFIE_teardown(); return 0; } /* 結果 a = [ +1.000000e+000 +5.000000e+000 +9.000000e+000 +1.300000e+001 ] [ +2.000000e+000 +6.000000e+000 +1.000000e+001 +1.400000e+001 ] [ +3.000000e+000 +7.000000e+000 +1.100000e+001 +1.500000e+001 ] [ +4.000000e+000 +8.000000e+000 +1.200000e+001 +1.600000e+001 ] flipdim(a,mode=>1) = [ +4.000000e+000 +8.000000e+000 +1.200000e+001 +1.600000e+001 ] [ +3.000000e+000 +7.000000e+000 +1.100000e+001 +1.500000e+001 ] [ +2.000000e+000 +6.000000e+000 +1.000000e+001 +1.400000e+001 ] [ +1.000000e+000 +5.000000e+000 +9.000000e+000 +1.300000e+001 ] flipdim(a,mode=>2) = [ +1.300000e+001 +9.000000e+000 +5.000000e+000 +1.000000e+000 ] [ +1.400000e+001 +1.000000e+001 +6.000000e+000 +2.000000e+000 ] [ +1.500000e+001 +1.100000e+001 +7.000000e+000 +3.000000e+000 ] [ +1.600000e+001 +1.200000e+001 +8.000000e+000 +4.000000e+000 ] */
INT FVALGAPI fnFIE_mat_rand | ( | FMATRIX * | a | ) |
ランダム行列の作成
入力された行列の成分に全てランダムな値を設定します。
設定される値の範囲は [2^(-53), 1-2^(-53)] です。 (これはMATLABのrand('twister')と同じ値範囲です)。
[in,out] | a | 値を設定する行列 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | パラメータ不正終了 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |