学习笔记(1)---matlab中常见函数解析
⼀.fscanf函数
matlab中函数fscanf在⽂件读取⽅⾯的实例如下:
从⽂件中有格式地读数据 fscanf
语法1:[a,count]=fscanf(fid,format,size)
根据指定的格式从fid ⽂件按照格式format读出数据并按size的格式放⼊内存。
a :读出的数据放⼊内存的变量名
count :返回值。0:失败、n>0:成功,n是读出数据个数。
fid :⽂件号
size :a的数据的维度
N : 列向量
inf : 读出⽂件全部数据
[M,N] : 读出数据以M*N的格式放⼊变量名a内
format :读出数据的格式
format是字符形式,与C语⾔基本相同。字符形式中有“%”与字符集(d,i,o,u,x,e,f,g,s,c,…)搭配构成。
如:  %s:单字符读
%c:读space字符
例:s=fscanf(fid,'%s') 返回⼀个字符。
a=fscanf(fid,']') 返回⼀个五位⼗进制整数。
size是⼀个[m n]的向量,m为⾏,n为列(注意,这⾥读取的顺序是按⾏读取,存储的时候是按列存储),若n取inf表⽰读到⽂件末尾。fid为fopen打开⽂件的返回值,
format是格式化参数(像printf、scanf)。
举个⼩例⼦:
内容:    13,1,3.4
        3,2.1,23
1,12,2
        4,5.4,6
现在为了读取001中的数据存在⼀个数组⾥,可以⽤如下⽅法
fid=fopen('');
data=fscanf(fid,'%f,%f,%f',[3,inf]) ;%这⾥得⽤单引号
fclose(fid);
这时data中的数据如下:
13    3    1    4
1    2.1  1
2    5.4
3.4  23    2    6
⼆.isempty函数
matlab中 ~表⽰逻辑运算符“⾮”,也就是取反;~isempty(msg) 表⽰如果msg是空元素(空元素表⽰未赋值的元素,0并不是空元素),结果为0(false);否则结果为1(true)。
详细解析:
isempty(msg)    判断msg是否为空,如果为空,结果为1,否则为0.
~isempty(msg)    表⽰将 isempty(msg) 的结果取反,也就是说如果msg为空,结果为0,否则为1.
实例演⽰:
1、验证已经赋值的0矩阵
在matlab命令窗⼝输⼊如下代码,运⾏结果如下:
2、验证未赋值的变量
三.reshape函数
reshape把指定的矩阵改变形状,但是元素个数不变,
例如,⾏向量:
a = [1 2 3 4 5 6]
执⾏下⾯语句把它变成3⾏2列:
b = reshape(a,3,2)
执⾏结果:
b =
1 4
2 5
3 6
若a=[1 2 3
4 5 6
7 8 9]
使⽤reshpe后想得到b=[1 2 3 4 5 6 7 8 9]fopen函数失败
只需要将a转置⼀下就可以了:
b=reshape(a',1,9)
三.clc,clear,clf等
clear是清变量,
clc只清屏,
clf清除图形窗⼝上的旧图形,
hold on是为了显⽰多幅图像时,防⽌新的窗⼝替代旧的窗⼝
四.Matlab实现批量处理图像的两种⽅法
基本上有两个⽅法:⼀个是将你的图像统⼀进⾏⼀次重命名如:1.jpg,2.jpg等,然后利⽤for循环依次进⾏处理即可,如下⾯的语句:假设你的图像共有20副:
str='D:\做差\好的图像\'; %我的图像放在D盘,做差⽂件夹下,好的图像⽂件夹下
for i=1:20
I=imread([str,num2str(i),'.bmp']); %依次读取每⼀幅图像
%在此处进⾏你的图像处理即可
end
⽅法⼆:
将图像统⼀⽅法⼀个⽂件夹下,不需要统⼀进⾏重命名了,利⽤uigetdir函数得到你所处理图像的路径,然后对此路径下的所有图像进⾏处理,举例如下:我只处理bmp⽂件
srcDir=uigetdir('Choose source directory.'); %获得选择的⽂件夹
cd(srcDir);
allnames=struct2cell(dir('*.bmp')); %只处理8位的bmp⽂件
[k,len]=size(allnames); %获得bmp⽂件的个数
for ii=1:len
%逐次取出⽂件
name=allnames{1,ii};
I=imread(name); %读取⽂件
%然后在此处添加你的图像处理程序即可
end
success…
四.shading interp;
shading 是⽤来处理⾊彩效果的,分以下三种:
no shading ⼀般的默认模式即shading faceted
shading flat 在faceted的基础上去掉图上的⽹格线
shading interp 在flat的基础上进⾏⾊彩的插值处理,使⾊彩平滑过渡
在为使⽤shading interp时,⽣成的图像是⿊漆漆的⼀团,在使⽤后,则变得很清晰明了。
⽹上查到了许多相关的解释:
shading interp 会区分每个线形区域的颜⾊,并且插⼊与其相近的颜⾊
shading interp  在⽹格⽚内采⽤颜⾊插值处理,得出表⾯图显得最光滑!
shading interp 对图形进⾏阴影处理!
五. ismember函数——检测集合中的元素
ismember函数⽤来检测元素是否在集合中。
1.tf=ismember(a,b)
返回与a⼤⼩相同的逻辑数组,如果a中的元素属于b,那么A中的相应位置返回1(true),否则返回0(false)。
例:a=[1 2 3 4 5];
b=[1 3 5];
c1=ismember(a,b);  %判断a中的元素有没有在b中出现
c2=ismember(b,a);  %判断b中的元素有没有在a中出现
那么 c1= 1    0    1    0    1
c2= 1    1    1
2. [tf, loc] = ismember(a,b)
tf返回⼀个和a同样⼤⼩的矩阵,a的元素在b中出现,tf上的相应位置元素值为1,没有出现则为0;loc也是返回⼀个和a同样⼤⼩的矩阵,其相应位置的值为a相应位置的元素在b中出现的最后标号,注意是最
后的标号,若某元素在b中出现多次,则记录的是最后⼀次出现的标号,若该位置上的a的元素没有在b中出现,则返回0.
例: a=[1 2 3 4 5];
b=[1 3 5 8 3 5 4 7 9 4];
[tf1, loc1] = ismember(a,b);
[tf2, loc2] = ismember(b,a);
结果
tf1= 1    0    1    1    1
loc1=1    0    5    10    6
tf2=1    1    1    0    1    1    1    0    0    1
loc2=1    3    5    0    3    5    4    0    0    4
3.k=ismember(a,b,'rows')
a与b是列数相同的矩阵,如果a中的某⼀⾏与b中某⼀⾏元素相同,返回1,否则返回0。注:k=ismember(a,b,'rows')中2012版本的Matlab是‘rows’,⽽以前版本的是‘row’
例 a=[1 2 3;
2 4 6];
b=[1 2 3;
2 4 7;
2 4 6;
1 3 6];
k1=ismember(a,b,'rows');
k2=ismember(b,a,'rows');
结果 k1 =1
1
k2=1
1