EDA365电子论坛网

标题: 从Matlab导出数据(fprintf,dlmwrite,xlswrite) [打印本页]

作者: haidaowang    时间: 2020-4-2 10:08
标题: 从Matlab导出数据(fprintf,dlmwrite,xlswrite)
) k: }1 l$ C  e+ M$ ?1 ?& `6 p
1. 用fprintf 函数写数据到txt,xls7 H* S1 \& c* K0 A$ X
. C' ?# q3 z  w! U6 Q. _+ S+ C
Example:
- o. a7 q! W: T( y2 {3 Y8 \' P9 E. [5 E4 `, j: R. ]4 W$ {( _
x = 0:.1:1;
9 e/ i/ Y7 [) Y0 P2 b8 a! c7 H3 [6 ly = [x; exp(x)];
+ Z: {* Z6 F( X- U8 Mfid = fopen('exp.txt', 'w');1 `3 f- c, o! x: G% V/ q- w
fprintf(fid, '%6.2f .8fn', y);% {+ G  A* [+ Y) T& h# b! j
fclose(fid)
0 ^/ _# y& Q, Utip:执行上述代码执行,肯定不会换行的,换行的问题试一下下面的代码
' W5 _# b0 `2 E
( K( e. n; h* e8 ^, ?x = 0:.1:1;
% k" H3 ~( _  p1 H% B/ L; Ly = [x; exp(x)];! c$ R, m! S5 s  G6 `) u2 i
fid = fopen('exp.txt', 'wt');$ j; S9 A0 [% E* w6 Q$ M
fprintf(fid, '%6.2f .8fn', y);0 `/ W- l/ `* o. f) Z! e
fclose(fid);
: r8 G3 ]# Q3 x. D/ q( k
6 \( s8 X. v9 R. r这次就没有问题了,我们要注意fopne的参数wt 而不是 w,这是matlab的在线帮助的东东
% c3 B8 }! z* G
) j$ \* @9 H4 l8 T! A) sfid = fopen(filename, permission_tmode)on Windows systems, opens the file in text
9 V/ Q# x- c7 I: ?& emode instead of binary mode (the default). Thepermission_tmodeargument consists9 M. n: a4 d  [% @2 C1 f
of any of the specifiers shown in thePermission Specifierstable above, followed
5 g4 n# ~' _0 V2 @4 h5 Uby the lettert, for example'rt'or'wt+. On UNIX®systems, text and binary mode
2 V1 _! E$ n+ r% hare the same. (UNIX is a registered trademark of The
* |* o0 r3 b5 O  \/ WOpen Group in the United States and other countries).& Z: ?) T: x; l3 t! C

1 l& K2 K# M( c6 R就是有两种读取模式binary or text. When choosing the binary model,No characters are
1 ^9 U* A5 k% b8 B7 ?: Kgiven special treatment. 所以我们选择要注明text模式。
- Y2 B6 d. i0 U. x' t3 @1 A& x- h$ X& Q6 l5 h/ }
2. dlmwrite :将一个矩阵写到由分隔符分割的文件中。
! s1 G) F8 g2 j+ n3 K, m7 w3 u/ o
在保存整数到文件时使用save存为ascii文件时,常常是文件里都是实型格式的数据(有小数点,和后面很多的0,看着很不方便)。于是要保存此类数据时,我们可以使用此dlmwrite命令。9 C, i  P( G& }& R
8 J# p& A3 v; f8 h7 `# \
使用方法:9 }3 T( h7 [2 `8 ]5 ~. u. l
dlmwrite('filename', M)
4 B  B7 V, `+ V; H使用默认分隔符“,”将矩阵M写入文本文件filename中;8 t8 o" y! S* q* O
dlmwrite('filename', M, 'D')9 s( @( I1 f$ ^  Z
使用分隔符D分割数据,“t”表示tab分割,“,”为默认分割符;
9 ]% u* N: ?: A( d9 k* o1 zdlmwrite('filename', M, 'D', R, C)6 J- F$ `  n2 j9 H7 g4 }
从矩阵M的第R行、第C列开始,作为要写矩阵块的左上角,将数据用D分割写入文件。
7 {. z* y# [, W) p6 D其他用法有:, w( J/ \3 r* \+ U
dlmwrite('filename', M, 'attrib1', value1, 'attrib2', value2, ...)2 I" C* s6 a( B( f% C) s5 W
dlmwrite('filename', M, '-append')
# C4 w5 \3 c3 t+ t/ ddlmwrite('filename', M, '-append', attribute-value list)1 ^& Y, T9 p, k

) J% d* |/ V/ A8 v/ _; r/ q. [例如:2 Q5 u+ k6 J8 X+ x+ C
a = [1 2 3; 4 5 6; 7 8 9];
' H9 V6 f* E) `$ m, L6 d" idlmwrite('test.txt', a);5 g0 F# m& R  H& E2 i: x
6 ~+ z: }/ _. x8 e, N$ B- N( I
则test.txt中的内容为:, i5 L/ I1 x9 U9 C6 O! h+ m
1,2,3
  _: q- S2 n& H/ o8 c0 R4,5,6- a! L; y& q# @: B5 W$ _% l8 M
7,8,9& v3 b- L! B1 g$ k  |4 z
( B9 j# F/ ?% @+ z: \- x( k/ J% s
而使用save/ K! @1 W* L% G- n3 q, y
a = [1 2 3; 4 5 6; 7 8 9];) L1 d2 F. A2 l* b
save 'tst.txt' a -ascii;文本文件里的内容为:2 a* J+ f- O. t2 {! L3 L
   1.0000000e+000   2.0000000e+000   3.0000000e+000
8 ~8 m0 E2 G3 S1 O   4.0000000e+000   5.0000000e+000   6.0000000e+000
/ F4 _- F$ E! m8 J/ d6 ?& T   7.0000000e+000   8.0000000e+000   9.0000000e+000+ H7 K5 D) }1 P. z, r; ]
: @4 F% v, V$ W: u% x9 ~

" F. {1 I; J5 g$ o$ M. K4 G3.xlswrite 写入excel) |6 `7 [6 n* K  e! Z: X
" C& ]  i1 p* Y6 G2 m+ U5 H
4.fprintf和dlmwrite区别! |9 j0 a' S3 U% _, b5 ?
7 l# c. c: j2 z: z5 s
MATLAB在图像处理中的应用,实际是对图像矩阵的操做运算,MATLAB在图像处理中的常用的命令有:$ W1 \5 t5 l9 Y& E5 J9 A7 L
imread(): 从图像文件夹中读取图像的函数;
$ X7 h) h$ w! V5 b! j4 W. K2 mimwrite(): 输出图像的函数;; V9 O! x! n6 @
imshow(), image(): 图像显示于屏幕的函数;' `# a4 m2 B9 d
imcrop(): 对图像进行裁剪的函数;;4 }( V' H9 ?0 M3 ?5 |+ w. P
imresize(): 实现对图像的插值缩放的函数;4 D" f# {+ ]0 ]( D, W% t2 O
imrotate(): 用实现对图像的旋转。+ Q: C7 k+ l5 B- `/ Z
im2double(),double(): 将图像数组转化为double类型;* Z6 v! J7 X8 F) U$ v1 c2 {5 H
im2uint8(),uint8(): 将图像数组转化为uint8类型;9 O- O. \5 f& j( J# m8 b
im2uint16(),uint16(): 将图像数组转化为uint16类型;
" k- X' `9 B) [7 ^  `关于上述的命令使用方法可以参考一些MATLAB方面的书籍或者用MATLAB自带的帮助(help or doc)命令.: ?' `  X1 \. r1 w1 {) ^2 t. }
如 我想知道dwt2()命令的使用方法 可以执行下面的命令7 V: _8 U2 F. ]' T- H
>> help dwt2 或 >>doc dwt2
  U9 s& d. `$ f1 F+ r% E1 x系统就会告诉你它的使用要求和方法,如果系统说找不到对应的帮助文件,那就可能是你装的MATLAB里面没有这个命令,那很可能这个命令就不能使用., p, w6 p' I; w* V& [
在图像数组的输出到文件的操作上,我发现fprintf比dlmwrite明显快很多,但这两个输出的数据格式有些差别,见下面操作:
& A9 S+ b9 |6 t6 j: z) @>> a=[1 2 3;4 5 6;7 8 9]
  b( @: e5 J$ j7 M9 xa =
: W/ j7 C) d! e; a6 M0 `     1     2     3
& _6 v( v( \8 y7 X% g     4     5     6, {3 u4 ~7 E9 z+ D/ F
     7     8     9- n3 }6 V( r5 v3 t" |/ `
>>fid = fopen('exp.txt','w');5 I( z$ g( d  }. w# X
fprintf(fid,'%2.0fn',a);# a) y# @, u/ X1 Q
fclose(fid);
6 `" n! Q% F8 g  Q! t  z& K0 V& Z; g% U+ q( Q. |$ T) R
>> type exp.txt
# I: d" z3 b  {" r5 Z7 ]! i
- ^2 X" o4 e/ r5 M- y+ [1
7 b$ J) j3 H" \; Q( k/ G! g4 o6 d7 x4( M# g6 _( V) p2 }1 O8 m0 Q+ X
7
, L; p2 z+ i  I( N' k3 h26 Q. G& [9 t7 M
5: n$ }$ X/ P# K* l  l
8
: @) D* g0 a/ |6 q* z) G+ d3
  K1 M- V& |$ O  }9 T% ]5 F6
- a1 h8 i+ l) H6 q: [) w- [97 H* D% k4 W. ^+ Q1 u
fprintf输出是一列一列的从左到右输出。
' v0 w8 w* p: `: ~3 U7 x>> dlmwrite('eg2.dat',a,'n');! x7 i8 }7 u) @  n, s; V
>> type eg2.dat
0 Y/ i" Q! b% d" S7 g1& L2 b' E9 `9 [" O# v
2
8 _! i6 k6 E) F7 p30 R4 m  ]8 U  ?; Z1 h4 Z
4/ A* u2 f8 |  K. x& n
58 ?4 \5 c7 y% q, N& F2 P
6
2 r7 S$ x- V# A7; w5 z9 J0 g9 L4 X, D, V, G
8
- v5 s7 _9 E4 ~8 c( N" x+ X. S4 ?& t9
) r) J' `3 r/ Z+ T$ ^5 R7 fdlmwrite输出是一行一行的从上到下输出。: o2 Z4 X: b7 m7 s( n
下面是一个比较简单的图像处理程序:
6 B) t. l0 T  T3 u* {; lclear;%清除当前工作区所有变量
  n  {% \2 E! R9 |8 F! ldata=imread('E:2D前处理eg1.bmp');%从图像文件夹中读取图像eg1.bmp2 p+ n2 s7 ~. K8 z1 f# S2 x9 `
data=double(data);%将图像数组data转化为double类型
+ |% [% L2 D3 m; H7 A[x,y]=size(data);%求数组大小,x是data数组有多少行,y是data数组有多少列* C2 E: D6 e$ A4 P" f
data1=imresize(data,[x,y*2/1.732]);%实现对图像的左右插值放大2/1.732倍6 J" N4 u; u' u+ B7 R
[x,y]=size(data1);%%求放大后图像数组大小
1 o! e! I. F% U( W! T' ]fid = fopen('E:2D前处理Particletest.dat', 'wt');%打开图像数组的将要输出到文件* p" ?- C/ }3 o, j9 M) {* B
fprintf(fid, '%2.0ft%2.0fn', x, y);%输出x,y值
1 O# a0 m7 x; j* C9 [4 Ffprintf(fid, '%2.0fn', data1);%输出图像数组数据3 Z& x  R& i4 `& r6 O$ c. [2 a
fclose(fid);%关闭文件指针4 o" o: y5 I. C) q

+ ~& b5 y8 v) O0 C# G% P  v2 C, c) H1 R+ m& r* P

作者: xygongkui    时间: 2020-4-2 18:27
导出的很详细,函数表述很详细,值得学习
9 `$ N. Z% e0 u/ k, N[x,y]=size(data1);%%求放大后图像数组大小2 z6 F0 l2 e+ i5 }/ @3 N+ m9 \& t





欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2