ファイルの読み書き

変数の場合... 1

配列の場合... 1

セルと構造体... 1

MATLABのMATファイルとの互換性... 1

テキストファイルの読み書き... 1

行列をテキスト形式にして読み書き... 1

バイナリデータの読み書き... 1

 

 

変数の場合

データの型で32bit単精度浮動小数点(float,single)は見当たりません。

x1=double(1);

//x2=single(x1);//32bit単精度浮動小数点は使えません

x3=int8(x1);

x4=uint8(x1);

x5=int16(x1);

x6=uint16(x1);

x7=int32(x1);

x8=uint32(x1);

x9=int64(x1);

x10=uint64(x1);

x11=string(x1);//MATLABnum2str

save('x.dat','x1','x3','x4','x5','x6','x7','x8','x9','x10','x11');

clear();

load('x.dat')

初期設定では64bit倍精度浮動小数点です。

x2の行を実行すると

未定義の変数: single

と表示されます。

 

配列の場合

N次元配列でも問題ありませんが、疎行列は2次元までです。

clear();
x1=rand(1,5);
x2=rand(3,4);
x3=rand(2,4,7);
x4=rand(3,5,2,4);
x5=rand(2,3,4,7,3);
x6=zeros(3,5);
x6(1,1)=3;x6(2,4)=2;
x6=sparse(x6);//疎行列
x7=zeros(2,2,2);
x7(1,2,1)=3;
//x7=sparse(x7);//3次元配列は疎行列になりません
save('x.dat','x1','x2','x3','x4','x5','x6');
clear();
load('x.dat');

 

セルと構造体

特に問題ありません。

clear();
x1=cell(2,3,4);//空行列ならぬ空セルです。
x1{1,1}=3;
x1{1,3}='abc';
x2.x21=1;//構造体です
x3.x31=rand(3,4);
save('x.dat','x1','x2','x3');
clear();
load('x.dat')

 

MATLABMATファイルとの互換性

Scilab 6.0.0Matlab R2013aは問題ありません。

clear();
x1=cell(2,3);
x1{1,1}='abc';
x1{1,2}=rand(2,3,2);
x2.x21=sparse(eye(3,3));
savematfile('x.mat','x1','x2');
clear();
loadmatfile('x.mat');

MATLABScilab

x1=single(rand(3,4));

x2=rand(2,5);

x3={'a','b','c'};

save('x.mat','x1','x2','x3')

x1は単精度浮動小数点です。

>> x1

 

x1 =

 

    0.8147    0.9134    0.2785    0.9649

    0.9058    0.6324    0.5469    0.1576

    0.1270    0.0975    0.9575    0.9706

Scilabで読んでみます。

--> clear();

 

--> loadmatfile('x.mat');

 

--> x1

 x1  =

 

   0.0029154   0.0000534   0.   0.

   0.0031524   0.005618    0.   0.

   4.322D-11   0.0059746   0.   0.

single32bit単精度浮動小数点は配列数は合ってましたが、値はデタラメになっていました。

その他は大丈夫でした。

 

テキストファイルの読み書き

clear();

x1='1234567890';

x2='abcdefg';

x3='aaa';

fid=mopen('test.txt','wt');//MATLABfopen

mputl([x1,x2],fid);//MATLABと違い、改行して読み込みになる

mputl(x3,fid);

mclose(fid);

 

clear();

fid=mopen('test.txt','rt');

x4=mgetl(fid);//指示しないと全部読み込み

mclose(fid);

disp(x4);

 

fid=mopen('test.txt','rt');

x5=mgetl(fid,2);//2行読み込み

x6=mgetl(fid,1);

 

mclose(fid);

disp(x5);

disp(x6);

表示された結果は以下の通り

!1234567890  !

!            !

!abcdefg     !

!            !

!aaa         !

 

!1234567890  !

!            !

!abcdefg     !

 

 aaa

 

行列をテキスト形式にして読み書き

clear();

x1=rand(3,5);

disp(x1);

text1='Hi,Ro,S,Him,A';//項目のつもり

fprintfMat('test.txt',x1,'%5.3f',text1);

[x2,text2]=fscanfMat('test.txt');

disp(text2);//項目名など

disp(x2);//型はdoubleです

実行した結果

   0.3873779   0.3435337   0.2615761   0.5253563   0.2256303

   0.9222899   0.3760119   0.4993494   0.537623    0.6274093

   0.9488184   0.7340941   0.2638578   0.1199926   0.7608433

 

 Hi,Ro,S,Him,A

 

   0.387   0.344   0.262   0.525   0.226

   0.922   0.376   0.499   0.538   0.627

   0.949   0.734   0.264   0.12    0.761

テキストファイルで保存された脳波などはこの機能は便利だと思います。

 

バイナリデータの読み書き

型はd:double倍精度浮動小数点、f:float単精度浮動小数点、l:long 8バイト整数、i:int 4バイト整数、s:short 2バイト整数、c:character 1バイト整数、u..:符号なし、..l:little endian..b:big endianだそうです。

mputmgetfileID不要です。

mgetは強制的にdouble倍精度浮動小数点になります。megtiは強制的にint 4バイト整数になります。

clear();

x1=rand(1,3)*100;

disp(x1);

x2='abc';

fid=mopen('test.bin','wb');

mput(x1,'d');//doubleで保存

mput(double(int32(x1)),'fb');//big engianfloatで保存

mput(int32(x1),'s');//shortで保存

mputstr(x2,fid);//文字列で保存

mclose(fid);

 

clear();

fid=mopen('test.bin','rb');

x3=mget(3,'d');//3doubleで読む

x4=mget(3,'fb');//3big endianfloatで読む

mseek(3*8+4*2);//読み込み位置を変更

x5=mget(1,'fb');

x6=mgeti(3,'s');//3shortで読み込む

x7=mgetstr(3,fid);//文字列を読み込む

mclose(fid);

disp(x3);

disp(x4);

disp(x5);

disp(x6);

disp(x7);

実行結果は以下の通り

   93.296162   21.460079   31.2642

 

   93.296162   21.460079   31.2642

 

   93.   21.   31.

 

   31.

 

  93  21  31

 

 abc