ファイルの読み書き
データの型で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);//MATLABのnum2str
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')
Scilab 6.0.0→Matlab 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');
MATLAB→Scilabは
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.
singleの32bit単精度浮動小数点は配列数は合ってましたが、値はデタラメになっていました。
その他は大丈夫でした。
clear();
x1='1234567890';
x2='abcdefg';
x3='aaa';
fid=mopen('test.txt','wt');//MATLABはfopen
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だそうです。
mputとmgetはfileID不要です。
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 engianのfloatで保存
mput(int32(x1),'s');//shortで保存
mputstr(x2,fid);//文字列で保存
mclose(fid);
clear();
fid=mopen('test.bin','rb');
x3=mget(3,'d');//3つdoubleで読む
x4=mget(3,'fb');//3つbig endianのfloatで読む
mseek(3*8+4*2);//読み込み位置を変更
x5=mget(1,'fb');
x6=mgeti(3,'s');//3つshortで読み込む
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