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,xls
7 H* S1 \& c* K0 A$ X
. C' ?# q3 z w! U6 Q. _+ S+ C
Example:
- o. a7 q! W: T( y2 {3 Y
8 \' P9 E. [5 E4 `, j: R. ]4 W$ {( _
x = 0:.1:1;
9 e/ i/ Y7 [) Y0 P2 b8 a! c7 H3 [6 l
y = [x; exp(x)];
+ Z: {* Z6 F( X- U8 M
fid = 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, U
tip:执行上述代码执行,肯定不会换行的,换行的问题试一下下面的代码
' W5 _# b0 `2 E
( K( e. n; h* e8 ^, ?
x = 0:.1:1;
% k" H3 ~( _ p1 H% B/ L; L
y = [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) s
fid = fopen(filename, permission_tmode)on Windows systems, opens the file in text
9 V/ Q# x- c7 I: ?& e
mode instead of binary mode (the default). Thepermission_tmodeargument consists
9 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 U
by the lettert, for example'rt'or'wt+. On UNIX®systems, text and binary mode
2 V1 _! E$ n+ r% h
are the same. (UNIX is a registered trademark of The
* |* o0 r3 b5 O \/ W
Open 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 ?: K
given 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+ n
3 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 z
dlmwrite('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/ d
dlmwrite('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" i
dlmwrite('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 R
4,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 G
3.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 m
imwrite(): 输出图像的函数;
; 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 x
a =
: 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& K
0 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 x
4
( M# g6 _( V) p2 }1 O8 m0 Q+ X
7
, L; p2 z+ i I( N' k3 h
2
6 Q. G& [9 t7 M
5
: n$ }$ X/ P# K* l l
8
: @) D* g0 a/ |6 q* z) G+ d
3
K1 M- V& |$ O }9 T% ]5 F
6
- a1 h8 i+ l) H6 q: [) w- [
9
7 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 g
1
& L2 b' E9 `9 [" O# v
2
8 _! i6 k6 E) F7 p
3
0 R4 m ]8 U ?; Z1 h4 Z
4
/ A* u2 f8 | K. x& n
5
8 ?4 \5 c7 y% q, N& F2 P
6
2 r7 S$ x- V# A
7
; w5 z9 J0 g9 L4 X, D, V, G
8
- v5 s7 _9 E4 ~8 c( N" x+ X. S4 ?& t
9
) r) J' `3 r/ Z+ T$ ^5 R7 f
dlmwrite输出是一行一行的从上到下输出。
: o2 Z4 X: b7 m7 s( n
下面是一个比较简单的图像处理程序:
6 B) t. l0 T T3 u* {; l
clear;%清除当前工作区所有变量
n {% \2 E! R9 |8 F! l
data=imread('E:2D前处理eg1.bmp');%从图像文件夹中读取图像eg1.bmp
2 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 F
fprintf(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