学习笔记(1)---matlab中常见函数解析

时间:2024-03-08 15:51:43

一.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(\'001.txt\');

data=fscanf(fid,\'%f,%f,%f\',[3,inf]) ;%这里得用单引号

fclose(fid);

这时data中的数据如下:

13    3     1     4

1     2.1   12    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]

只需要将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
       0
       1
       0