mots quotidiens. | |
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp | by hns, version 2.10-pl1. |
|
|||||||||||||||||||||||||||||||||||||||||||||||||
Cでプログラムを書いていて, テキスト形式でセーブされたパラメータファイルから
ベクトル/行列に読み込むという処理は非常によくあると思うのだが
(MATLABの load に相当), うっかり前に書いたコードを忘れて車輪を再発明する
ところだった。;
誰が書いても同じようなコードになると思うのだけれども, 次元を事前に指定せず,
読むのと同時に決めるコードは一瞬では書けないと思うので, せっかくなので
下に公開しておきます。(ファイルに書く方は簡単なので省略。)
loader.c
loader.h
dmatrix.c
dmatrix.h
これを使うには, 以下のようにします。
#include "loader.h" double *vector, **matrix; int dim, rows, cols; if ((vector = load_vector(file, &dim)) == NULL) { fprintf(stderr, "can't open vector from %s.\n", file); exit(1); } if ((matrix = load_matrix(file, &rows, &cols)) == NULL) { fprintf(stderr, "can't open matrix from %s.\n", file); exit(1); }
MATLABでも, Matlabコンパイラ(mcc) を使う場合には標準の load が使えない
ので, 自分でベクトルや行列をセーブ/ロードするコードを書かないといけない
のだった。少し考えないとナイーブなコードを書いてしまいがちなので, 公開した
方がいいのかなと思いますが, 微妙。もし欲しい人がいたら, ご連絡下さい。
例えば, ベクトルをMATLABでロードするコードは以下のような感じに書けます。
function v = vload(file,sep) % v = vload(file,[sep]) % load a vector v from file in ASCII format. (for mcc compiler) % output is a column vector irrespective of original. % file = filename of input, % sep = separator character in row-wise format. % Fri Feb 13 16:41:15 2004 JST daichi.mochihashi<at>atr.jp % open file fid = fopen(file,'r'); if (fid == -1) error(sprintf('vload: %s can''t be opened.',file)); end % field separator if nargin < 2 sep = ''; % null string end % read data fprintf(2,'loading from file %s..\n',file); [v,count] = fscanf(fid,sprintf('%%g%s',sep),inf); % close file fclose(fid); fprintf(2,'done.\n');研究に直接関係ないのと, それほど書くのが難しくないわりに, 皆が同じコードを 自分で考えて書かないといけない(その時, もしかするとアドホックなコードを書いて しまうかも知れない)のがムダっぽいなぁ, とは思うわけですが。 うーん。
タイトル一覧 | |