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 除去size为1的维度
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) 敲回车
可以看到如下结果: