MATLAB学习札记


1 文件的读写

fid =fopen('yout.txt','r') ;//以只读方式打开文件yout.txt

TrueVal= fscanf(fid,'%f'); //读取yout.txt中的float型数据

TrueVal=TrueVal';TrueVal自身矩阵变换

fclose(fid);  关闭文件yout.txt

 

二进制文件的读写操作

Matlab中fread函数用法

   “fread”以二进制形式,从文件读出数据。

语法1:[a,count]=fread(fid,size,precision)

语法2:[a,count]=fread(fid,size,precision,skip)

a用于存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄

size:    不指定     :到尾返回读。

          N         : 读出N个数据,构成列向量。

          inf       : 读出fid指向的打开的文件的全部数据。

          [M,N]     : 读出N个数据,构成列向量,填入M*N矩阵

    precision(精度)

precision(精度)规定了以浮点数、整型数、字符读出时位。matlab的precision(精度)的表达式与c语言、fortran语言、是一致的。不规定precision(精度),则字符默认为: uchar、则数值默认为:双精度 。

      以下precision(精度)将保证读出具有一致的体积。

MATLAB           C or Fortran             Descriphon(精度)

'char'               'char*l'                      8 位,字符型

'uchar'             'unsigned char'          8 位

'schar'              'signed char'             8 位,字符型

'int8'                'integer*1'                8 位,整型数

'intl6'               'integer*2'                16 位,整型数.

'int32'              'integer*4'                32 位,整型数.

'int64'              'integer*8'                64 位,整型数

'uint8'              'integer*l'                 8 位

'uintl6'             'integer*2'                16 位

'uint32'            'integer*4'                32 位

'uint64'            'integer*8'                64 位

'float32'           'real*4'                   浮点数, 32 位

'float64'           'real*8'                   浮点数, 32 位

 

以下precision(精度)将不保证读出具有一致的体积。

MATLAB           C or Fortran            Descriphon(精度)

'short'              'short'                     16 位,整型数

'int'                  'int'                         32 位,整型数

'long'               'long'                       32 (64) 位,整型数

'uShort'           'Unsigned short'        16 位

'uint'               'Unsigned int'            32 位

'ulong'            'unsigned long'          32 (64) 位   

'float'              'float'                      浮点数, 32 位

'double'           'double'                  浮点数, 64 位

 

以下precision(精度)规定读出指定的体积n。

'bitN'          N位,整型数      1<=N<=64

'ubitN'         N位,            1<=N<=64

 

文本文件的读写操作

读文本文件
fscanf 函数的调用格式为:
[A,COUNT]= fscanf (fid, format, size)
其中A用以存放读取的数据,COUNT返回所读取的数据元素个数。fid为文件句柄。format用以控制读取的数据格式,由%加上格式符组成,常见的格式符有d,f,c,s

写文本文件
fprintf 函数的调用格式为:
COUNT= fprintf(fid, format, A)
其中A存放要写入文件的数据。先按format指定的格式将数据矩阵A格式化,然后写入到fid所指定的文件

 

海量数据的导入导出技巧

load 和 save命令

  M = load(‘sample_file.txt’)
% 加载文件sample_file.txt到矩阵M
save sample_file_plus5 M
% 将M保存到文件sample_file_plus5中;

  save sample_file_plus5.txt M -ascii

  % 将M保存到文本文件sample_file_plus5.txt

 

 

2. matlab的reshape函数,shiftdim函数和permute函数,squeeze函数

data=[1,2,3,4;5,6,7,8;9,10,11,12];

A=reshape(data,2,2,3)

Adim=shiftdim(A,1)

Ap1=permute(A,[2,3,1])

 

解释:本来data是4行3列(1层)的矩阵

我们可以用2个下标定位,如data(3,2)表示data的第3行第2列的元素

但其实也可以用1个下标定位,它的顺序是先第一个维度,再第二个维度(先行后列),如data(1)表示data(1,1)=1,data(2)表示data(2,1)=5,data(3)表示data(3,1)=9,data(4)表示data(1,2)=2,data(5)表示data(2,2)=6,data(6)表示data(3,2)=10,以此类推

 

reshape后变为2行2列3层的三维矩阵。三维矩阵可以用3个下标定位,也可以用1个下标定位,定位时的顺序也是先第一个维度,再第二个维度,最后第三个维度。reshape前后不改变一维下标定位顺序,即A(1,1,1)=A(1)=data(1)=1,A(2,1,1)=A(2)=data(2)=5,A(1,2,1)=A(3)=data(3)=9,A(2,2,1)=A(4)=data(4)=2,A(1,1,2)=A(5)=data(5)=6,以此类推

 

shiftdim(A,1)使A的维号左移1位,就是第2维变第1维,第3维变第2维,第1维变最后维。A是2*2*3的矩阵,Adim就是2*3*2的矩阵,并且有A(1,2,3)=Adim(2,3,1),A(1,2,1)=Adim(2,1,1),以此类推

 

permute(A,[2,3,1])使A的维号按照先第2维、再第3维,最后第1维的顺序排列。在这里得到的矩阵和Adim完全相同。permute的功能比shiftdim强大,可以实现维号的任意顺序排列(或称置换),而shiftdim只是permute按左移(或右移)排列(数学上称为轮换)的一个特例。

 

squeeze  除去size1的维度

B = squeeze(A)

描述:

B = squeeze(A),B与A有相同的元素,但所有只有一行或一列的维度(asingleton dimension)被去除掉了。A singleton dimension的特征是size(A,dim)= 1。二维阵列不受squeeze影响; 如果 A 是一个rowor column矢量或ascalar (1-by-1) value, then B = A.

比如,rand(4,1,3)产生一个均匀分布的阵列,共3页,每页4行1列,经过squeeze后,1列的那个维度就没有了,只剩下4行3列的一个二维阵列。而rand(4,2,3)因为没有1列或1行的维度,所有squeeze后没有变化。

 

3 iptcheckinput函数的用法

 

4sum 和cumsum函数的用法

Cumsum: B= cumsum(A) 如果A是一个向量,cumsum(A) 返回一个向量,该向量中第m行的元素是A中第1行到第m行的所有元素累加和;

如果A是一个矩阵,cumsum(A) 返回一个和A同行同列的矩阵,矩阵中第m行第n列元素是A中第1行到第m行的所有第n列元素的累加和;

如果A是一个多维数组,cumsum(A)只对A中第一个非奇异维进行计算。

B = cumsum(A,dim)

cumsum(A,1)返回的是沿着第一维(各行)的累加和,cumsum(A,2)返回的是沿着第二维(各列)的累加和。

5 imhist

imhist(I,n)

imhist(X,map)

[counts,x] =imhist(...)

说明:imhist(I,n)其中,I为灰度的输入图像,n为指定的灰度级数目,缺省值为256;imhist(X,map)就算和显示索引色图像X的直方图,map为调色板。用stem(x,counts)同样可以显示直方图。counts和x分别为返回直方图数据向量和相应的彩色向量

 

6求矩阵的最大值和最小值

求矩阵A的最大值的函数有3种调用格式,分别是:

(1) max(A):返回一个行向量,向量的第i个元素是矩阵A的第i列上的最大值。

(2) [Y,U]=max(A):返回行向量Y和U,Y向量记录A的每列的最大值,U向量记录每列最大值的行号。

 

(3)max(A,[],dim):dim取1或2。dim取1时,该函数和max(A)完全相同;dim取2时,该函数返回一个列向量,其第i个元素是A矩阵的第i行上的最大值。

求最小值的函数是min,其用法和max完全相同。

 

7  find函数用于返回所需要元素的所在位置  (位置的判定:在矩阵中,第一列开始,自上而下,依次为1,2,3...,然后再从第二列,第三列依次往后数)

 

find(A)返回矩阵A中非零元素所在位置

>> A = [10 4 -3 0 0 0 8 6];

>> X =find(A)

 

X =   1    3     4     8    9

find(A>5)返回矩阵A中大于5的元素所在位置

>>find(A>5)

ans =     8    9

 [i,j,v]=find(A)  返回矩阵A中非零元素所在的行i,列j,和元素的值v(按所在位置先后顺序输出)

>> A=[3 20; -5 0 7; 0 0 1];

>>[i,j,v]=find(A)

i =     1    2     1     2    3

j =     1    1     2     3    3

v =     3   -5     2     7    1

find(A>m,4)返回矩阵A中前四个数值大于m的元素所在位置

 

8size(),length(),ndims()函数

size(a)表示矩阵每个维度的长度

比如size([1 2 3;4 56])

等于[2 3]

表示他有2行3列

size([1 2 3])

等于[1 3]

表示他有1行3列

另外size(a,n)表示矩阵a在第n个维度下的长度。

比如size([1 2 3;4 56],1)

等于2,表示有2行

size([1 2 3;4 56],2)

等于3,表示有3列

 

length(a)表示矩阵a的最大的长度,即max(size(a))

比如length([1 2 3;45 6])

等于3,因为2和3中最大是3

当a是向量时,即表示向量的元素个数,因为向量总是1×n或n×1的,而n一定大于或等于1.所以得到的结果一定是n

 

ndims(a)表示矩阵a的维数,即length(size(a))

比如ndims([1 2 3;4 56])

等于2,因为他是二维矩阵

matlab认为向量也是二维矩阵,只不过其中一个维度的长为1.

因此ndims([1 2 3])也等于2

 

我们可以构造一个三维甚至更高维度的矩阵,

比如a=cat(3,[1 2 34;5 6 7 8],[9 8 7 6;5 4 3 2])

他除了行和列以外还有一个维度,我们暂且把它叫做高度。

也就是说a有两层,第一层是[1 23 4;5 6 7 8],第二层是[9 87 6;5 4 3 2]

此时有size(a)=[2 4 2]

即2行4列2层

length(a)=4

([2 4 2]中最大为4)

ndims(a)=3

(因为他有3个维度)

8. std函数是用来计算标准偏差的一个函数,由于其有不同的参数,我们就用下面的例子进行介绍:

A =

     1    2     3

     1    1     1

标准差的两种计算公式如下:std(A):

std(A)函数求解的是最常见的标准差,此时除以的是N-1。

注意:此函数命令不能对矩阵求整体的标准差,只能按照行或者列进行逐个求解标准差,默认情况下是按照列。

在MATLAB主窗口中输入std(A)回车,结果如下:

输出的是每一列的标准差。

std(A,flag):

这里flag代表的是用哪一个标准差函数,如果取0,则代表除以N-1,如果是1代表的是除以N,

我们在MATLAB主窗口中输入std(A,1)  回车,std(A,0)  回车,可以看到如下结果

std(A,flag,dim):

第三个参数代表的是按照列求标准差还是按照行求标准差,std(A,1,1)代表的是按照列求标准差,std(A,1,2)代表的是按照行求标准差。

在MATLAB主窗口中输入如下命令:std(A,1,1)敲回车std(A,1,2) 敲回车

可以看到如下结果:

你可能感兴趣的:(matlab)