juaner's Blog

千里之行,始于足下。

文件I/O

1、打开和关闭文件

fid=fopen('filename','permission') ,其中permission是要对文件进行处理的方式。可以是下面的任一字符串:

  • ‘r’:只读文件,
  • ‘w’:只写文件,如果不存在,就生成新文件。
  • ‘a’:增补文件,在文件尾增加数据,如果文件名不存在,就生成新文件。
  • ‘r+’:读写文件,不生成文件。
  • ‘w+’:创建一个新文件或者删除已有文件内容,并可进行读写操作。
  • ’a+‘:读取和增补文件,如果文件名不存在,就生成新文件。

文件可以以二进制的形式或者文本形式打开,默认是前者,在二进制形势下,字符串不会被特殊对待。如果要求以文本形式打开,则在permission字符串后面加‘t’,例如‘rt+’等。

  fid是一个非负整数,称为文件标识,对于文件的任何操作,都是通过这个标识值来传递的。

   关闭文件的命令为:status=fclose(fid);若打开了多个文件想要全部关闭用:status=fclose('all')。

2、读取二进制文件

  • a=fread(fid),fread可以从文件中读取二进制数据,要验证的话用的命令为:disp(char(a'))。例如: fid=fopen('F:\task\dataout.dat','r') ;data=fread(fid);disp(char(data'));不知道为什么不能直接读出数据?

3、写入二进制文件

  • 格式为:count=fwrite(fid,a,precision),a是待写入的矩阵。返回值是成功写入的数据个数。如
  • fid=fopen('hello.txt','w');count=fwrite(fid,magic(5),'int32');status=fclose(fid);---------写的过程;
  • fid=fopen('hello.txt','r');data=fread(fid,25,'int32');status=fclose(fid);---------------------读的过程。

4、读取文本文件

     若已知ASCII文件的格式,要进行更精确的读取,可用fscanf函数从文件中读取格式化的数据,使用语法如下:

    [a,count]=fscanf(fid,format,size)。format的格式有:%s,%d,%f。size可以指定为:n,inf,[m,n]。

   例如:[a,count]=fscanf(fid,'%f',200);成功得到输入。

5、写入文本文件

      语法格式为:count=fprintf(fid,format,y)。里面各项参数的含义同上。常用的格式说明符如下:

  • %e:科学计数形式;
  • %f:固定小数点位置的数据形式;
  • %g:在上述两种格式中自动选取较短的格式。
  • 但是用这种方法我并没有解决我的问题,不知道是为什么。用下面的方法。

6、提取数据直接使用importdata,

      x=importdata('.\dataout.dat'); 用相对路径来表示的。
      [B,ind]=sort(x);
      C=[ind,B];
     dlmwrite('.\datasort.v2.txt',C,'delimiter','\t','newline','pc');

      其中,delimiter是分隔符,用tab分隔,后面的newline用来换行,pc是值。
     另外还有save的使用,这两个的区别讲的比较好的提供一个链接:

    http://www.aiseminar.cn/bbs/viewthread.php?tid=295

   http://hi.baidu.com/ueszx/blog/item/9e6f80d53dc0f8ce50da4b30.html

 

 

数值与矩阵

一、矩阵

1、matlab有两个特殊数值:inf和NaN。matlab中用inf和-inf来表示正无穷大和负无穷大。除法运算中除数为0或者运算结构溢出都会导致inf或者-inf的结果。用NaN表示一个既不是实数也不是复数的数值。是 Not a Number的缩写。类似0/0、inf/inf得到的都是NaN。

2、字符串用单引号来表示。

3、函数句柄是用来提供间接调用函数的数据类型,函数句柄可以传递给其他函数以便该函数句柄所代表的函数可以被调用。函数句柄还可以被存储起来,以便以后利用。用符号@后面跟着函数名来表示。例如:

 fhandle=@sin;fhandle(0);ans=0.

4、matlab的矩阵中分号是用来分隔列的,逗号是用来分隔行的。也就是说行矩阵用逗号分隔,列矩阵用分号分隔。

5、rand()是以机器时间为随机种子的,每次运行的结果都不一样。

6、构造向量的时候,:一般表示步长为1。也可产生任意定义步长的向量。特殊的两个函数是linspace(-6,6,4)和logspace()函数。前者是产生等距向量,后者是创建对数等距的向量。

7、矩阵的合并,表达式C=[A B]在水平方向合并矩阵,C=[A;B]在竖直方向合并矩阵。

8、矩阵合并函数:

  1. cat,在指定的方向合并矩阵,cat(DIM,A,B),cat(2,A,B),cat(1,A,B);
  2. horzcat,在水平方向合并矩阵,格式为horzcat(A,B);
  3. vertcat,在竖直方向合并矩阵,格式为vercat(A,B);
  4. repmat,通过复制矩阵来构造新的矩阵,格式为B=repmat(A,M,N),得到MXN个A的大矩阵。
  5. blkdiag,用已知矩阵来构造块对角化矩阵,格式为Y=blkdiag(A,B,...)。

9、删除矩阵的某一行,使某一行为空即可,使用A(2,:)=[ ]; 同理删除某一列A(:,2)=[ ]。A(1,i)表示第一行的所有元素。

10、引用矩阵元素的时候用的是A(i,j)。引用矩阵元素也可以使用线性方法,已知矩阵的下标可以用函数sub2ind()来得到线性引用的下标。用法如:linearindex=sub2ind(size(A),3,2);反过来为[row col]=ind2sub(size(A),6)。

11、冒号本身可以表示一列或者一行的所有元素,一列元素可以写为:A(:,j)。end表示最后一个元素。

12、矩阵尺寸函数有:n=length(X)表示矩阵最长方向的长度,n=ndims(X)表示矩阵的维数,n=numel(X)表示矩阵的元素个数。d=size(X),返回的大小信息以向量方式存储,[m,n]=size(X)返回的大小信息分开存储,m=size(X,dim)返回某一维的大小信息。

13、获得数据类型的信息:如:ischar(A),isfloat(A)等等。

14、判断矩阵的结构,如:isempty(A),issparse(A)等等。

15、矩阵结构的改变有:旋转,转置等等。

16、稀疏矩阵

  • 创建:S=sparse(A),A为满矩阵,也可以直接用这个函数创建稀疏矩阵,格式为:S=sparse(i,j,s,m,n),其中i和j分别是系数矩阵的非零元素的行和列指标,s为响应的非零元素的值。m和n分别是矩阵的行和列的高度。
  • 例如:S=sparse([1,2,3,4],[3,2,1,3],[1,2,3,4],4,4)
  • 得到的稀疏矩阵如下:
    S =

       (3,1)        3
       (2,2)        2
       (1,3)        1
       (4,3)        4
     
  • A=full(S),把一个稀疏矩阵转化为一个满矩阵,可以用转换函数full();
  • nnz(X)返回非零值的个数,nonzeros(X)返回非零值,nzmax(S)返回用于存储非零值的空间长度。spy()函数是用图形显示矩阵非零值的分布。

二、运算部分

   运算符有算数运算符,关系运算符和逻辑运算符。

   .*表示对应的元素相乘,*表示的是矩阵的乘法,其他的类似。

    要注意的是.'表示矩阵转秩,当矩阵时复数时,不求矩阵的共轭。’表示矩阵转秩,当矩阵是复数时,求矩阵的共轭转秩。

    异或为xor,例如xor(A,B);&,|,~的重载函数为:and(),or(),和not()。

三、字符串处理函数

  • 创建字符数组

    strcat用来连接字符串,但是连接的字符串之间没有空格,如果要保留空格的话,可以用矩阵合并符来实现字符串合并,用法分别为c=strcat(a,b)或者是c=[a b]。

    用户也可以构造二位字符数组,str=['second';'string'];但是要保持每一行具有相同的长度,如果长度不一致的,要在尾部添加空格补齐。

    更简单的使用char('first','second'),不要求长度一致。具有类似功能的函数是strvcat('name','string')。

  • 创建字符串单元数组

   celldata=cellstr(data)逆函数为char(celldata)。

  • 字符串比较函数

    strcmp(S1,S2),比较两个字符串是否相等。

    strncmp(S1,S2,N)比较两个字符串的前N个字符是否相等。

    strcmpi(S2,S2)比较两个字符串是否相等,忽略大小写。

    d strncmpi(S1,S2,N)比较两个字符串的前N个字符是否相等,忽略大小写。

   也可以用关系运算符比较字符串。

  • 字符串查找和替换函数

   str=strrep(str1,str2,str3);把str1中的str2子串替换成str3;

   k=findstr(str1,str2);查找输入中较长的字符串中较短字符串的位置;

   k=strfind(str,pattern)查找str中pattern出现的位置;

   k=strfind(cellstr,pattern)查找单元字符串cellstr中pattern出现的位置;

   token=strtok('str')获得第一个分隔符之前的字符串;空格,制表符和换行符为分隔符;

   token=strtok('str',delimiter)获得第一个分隔符之前的字符串;输入delimiter为指定的分隔符;

   [token,rem]=strtok(...)获得第一个分隔符之前的字符串;返回值rem为第一个分隔符之后的字符串;

   x=strmatch('str',STRS)在字符串数组STRS中匹配字符串str,返回匹配上的字符串所在行的指标;

   x=strmatch('str',STRS,'excat')功能同上,但是要求完全匹配。

  • 数值转换

   num2str:把一个数值类型的数据转换为字符串。