mots quotidiens.
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp by hns, version 2.10-pl1.

先月 2024年04月 来月
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

2006年01月05日(木) [n年日記]

#1 Loader

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');
研究に直接関係ないのと, それほど書くのが難しくないわりに, 皆が同じコードを 自分で考えて書かないといけない(その時, もしかするとアドホックなコードを書いて しまうかも知れない)のがムダっぽいなぁ, とは思うわけですが。 うーん。


1 days displayed.
タイトル一覧
カテゴリ分類
 なかのひと
Powered by hns-2.10-pl1, HyperNikkiSystem Project