篇一:Matlab编程和其他语言的区别
Matlab编程和其他语言的区别
一、字符和字符串
在MATLAB中不管是字符,还是字符串都是用单引号。而在C、C++、C#、Java等语言中,字符是用单引号的,字符串则必须用双引号。因此在MATLAB中如果需要在字符串中用到单引号的话,就要用两个单引号来代替。
如:
>> a='this''is an apple'
a =
this'is an apple
同理,如果字符串中需要双引号的话,可以用四个单引号来代替。如下: >> b='I''''am Tim'
b =
I''am Tim
在MATLAB中的字符串连接,我们可以使用一对中括号。当然,这种连接方式也适用于向量、矩阵等的连接。如下:
>> c=[a b]
c =
this'is an appleI''am Tim
>> a1=[1 2];b1=[3 4];
>> c1=[a1 b1]
c1 =
1 2 3 4
>> c2=[a1;b1]
c2 =
1 2
3 4
但是,对于字符串的连接不能使用加号(+)来进行。这点和在C++、C#、Java等语言中是不一样的。因为在MATLAB中这些字符串也是以矩阵的形式存储的,你要是用加号的话,需要两个矩阵的大小一致。比如:
>> a2='hello';b2='mustb';
>> a2+b2
ans =
213218223224209
但是,很明显,加完之后都是一系列的值了。本来,这些字符串也是以数值的形式存储的。而我们要取的字符串中某一个字符的时候,也是很方便的,直接像引用矩阵的元素一样。如下:
>> a2(1)
ans =
h
>> a2(4)
ans =
l
>> find(a2>'i')
ans =
3 4 5
可以看到,a2里面在字母i后面的字符有第3、4、5个字符,也就是llo了。
在MATLAB中要将一个数字转换为字符可以用num2str,将字符转换为数字可以用str2num。如下:
>> stra1=num2str(a1)
stra1 =
1 2
>> class(stra1)
ans =
char
>> strb1='[3 4]';
>> str2num(strb1)
ans =
3 4
对于strb1,我们可以使用eval函数,该函数可以将字符串作为一个MATLAB命令去执行。如下:
>> p=eval(strb1)
p =
3 4
相当于p=[3 4]。
当然了,C语言里面的sprintf、fprintf函数我们都是可以在MATLAB中使用的。比如: >> sprintf('Tim is %d years old.',24)
ans =
Tim is 24 years old.
至于fprintf函数,则需要用fopen去打开一个文件,然后写入数据进去。如下: >> fd=fopen('a.txt','w+');
>> fprintf(fd,'I am Tim.\n');
>> fprintf(fd,'My age is %d\n',24);
>> fclose(fd);
然后,用MATLAB Editor打开MATLAB当前目录下的a.txt就可以看到:
但是,当你用记事本打开的时候会看到:
这是因为在Windows上要想换行需要\r\n,而不能单是\n。
二、if语句、for语句、switch语句、while语句、try-catch语句都以end结尾
在MATLAB中,没有goto和do…loop和do…while语句。而且语句的结尾都是以end结尾的。 >> t=4;
>> if(t<5),disp('t is smaller than 5.'),end
t is smaller than 5.
当然,if语句也可以有else语句。
>> if(t>5),disp('t is bigger than 5.'),else,disp('t is smaller than 5.'),end
t is smaller than 5.
还可以用elseif。
>> if(t>5),disp('t is bigger than 5.'),elseif(t==5),disp('t is equal 5.'),else,disp('t is smaller than
5.'),end
t is smaller than 5.
在MATLAB中,由于矩阵的索引都是从1开始的,这点和C、C++、C#、JAVA等语言是不一样的。所以,在循环的时候建议从1开始循环,而且循环的时候不推荐用变量i和j。因为这两个变量在MATLAB中表示的是复数的虚部变量。当然,如果你的程序里面没有复数,就不用怕。如果有复数,就要小心了。
之所以从1开始,是因为大多数时候我们使用循环是为了依次能访问到矩阵的每一个元素,所以,如果矩阵的索引出现了0,那么就会报出错误。所以,从1开始循环,是一种很好的习惯,而不是要求你必须这样做。
而且,在for循环中,你的循环变量不仅可以是一个数,也可以是一个向量。看下面的程序: >> aa=[1 2;3 4; 5 6;7 8];
>> for i=aa,disp(i),end
1
3
5
7
2
4
6
8
>> aa
aa =
1 2
3 4
5
6
7 8
也就是说,i第一次的值是aa的第一列,i第二次的值是aa的第二列。这样的话,这个循环变量i就不仅仅是一个数了,二是一列数。
在MATLAB中,switch语句中是不用break的,而且默认的选项不是default,而是otherwise。如下:
a=5;
switch(a),
case 1,
disp('a is 1.');
case 2,
disp('a is 2.');
case 5,
disp('a is 5.');
otherwise,
disp('sorry, i do not know.');
end
还需要注意的是case后面没有分号,而C、C++、C#、Java等语言中是必须是分号的。在MATLAB中可是没有分号,我程序中的逗号,也可以是没有的。指向上面的程序,在MATLAB中的输出是:
a is 5.
至于while语句的使用和C、C++、C#、Java等语言中的while基本上是一致的。如下: a=5;
b=0;
while a>0
b=b+a;
a=a-1;
end
b
a
Matlab命令窗口的输出是这样的:
b =
15
a =
try-catch语句一般是用来捕捉错误的。
try
a=input('Input a number: ');
catch
error('unknown error.');
end
当运行上面的程序,在MATLAB中输入:
Input a number: #
??? Error using ==> tim_try at 4
unknown error.
三、变量不用声明
在MATLAB中的变量是可以不用声明的,这点和C类语言和Java是有很大区别的。但是,为了程序更清晰和加快程序的执行速度,提供初始化和声明有时是必要的。不如, b=[];
for i=1:10
b=[b i];
end
b
在MATLAB命令窗口的输出如下:
b =
1 2 3 4 5 6 7 8 9 10
如果你不初始化b为空的话,如下:
for i=1:10
b=[b i];
end
b
在命令窗口的输出如下:??? Undefined function or variable 'b'.
上面说过了,中括号[]可以用来合并向量的,这里变量b不存在,因此不能合并。所以会出错。
四、没有++、--操作符
在MATLAB中是没有++和--操作符的,因此需要转换。如a++; 可以转化为a=a+1;至于++a;你只需要将a=a+1的位置放到前面就可以了。
五、点乘、点除,但没有点加、点减
在点乘,是矩阵中的对应元素相乘。而不是矩阵的乘法。点除也是同样道理,对应元素想除。至于点加,就相当于加法。因为加减法本身就是对应元素的加减。
六、左除和右除
在C类和Java等语言中,除法就是一个操作符(/),但在MATLAB中(/)和(\)是有区别的。/代表的是右除,\代表的是左除。
>> A=[1 2;3 4];B=[5 6;7 8];
>> C1=A\B
C1 =
-3 -4
4 5
所以A左除B,就相当于A的逆矩阵乘B。
>> inv(A)*B
ans =
-3.0000-4.0000
4.0000 5.0000
那么可想而知,A右除B,就相当于A乘B的逆矩阵。
>> A/B
篇二:Matlab中关于脚本文件与函数文件的区别知识
原文地址:(Matlab基本知识----连载之六)M脚本文件和M函数文件、函数句柄(转,介绍的不错)
m文件分两种:函数和脚本。
1、matlab script file:
脚本文件没有输入输出,对工作空间(workspace)中的变量进行操作。 任何可执行的matlab命令都可以写入脚本文件。先来看一个简单的例子: 例1: 产生一个20元素的一维随机数组并画出。
解: 新建一个m文件命名为randplt.m(或者任何你喜欢的名字), 在其中加入如下两行代码:
data=randn(1,20);
plot(data);
保存后选择debug/run菜单或按F5键运行,观察workspace中多出了一个变量data。
脚本文件执行时, 就如同将文件中的每一条命令依次输入到matlab命令行中一样, 顺次执行。你可以尝试在command history窗口中按住ctrl键选择几行执行过的命令并单击鼠标右
键在快捷菜单中选择creat M file来快速创建一个m文件。
2、matlab function
函数文件可以接受输入和给出输出,当然也可以没有,就像c语言的函数。matlab函数最大的书写特点(同C比起来)是它的输出变量定义在函数名前面。看一例: 例2: matlab内部函数std给出数组的标准差std=sqrt(sum(X)/N),编写函数stderr求实验误差 err=sqrt(sum(X)/(N*(N-1))), 代码如下: function err=stderr(arr)
%实验误差(标准差估计)evaluate along each column of arr
err=std(arr)./sqrt(size(arr,1)-1);
文件存为stderr.m, 运行时输入a=[1;2;3];建立一个列数组a, 然后输入stderr(a)则给出
a的方差。(若输入行数组则发散,因N-1=0)
此例中输入变量为arr, 函数名为stderr, 输出变量err, 此三者皆写在关键字function后面同一行。无需再使用return将err的值返回。
注意:
(1)函数文件的命名要使用文件内主函数声明的名称,否则出错。
(2)函数内部可以嵌套子函数并为该文件的主函数调用,只需将子函数写在主函数代码后面。
(3)一个函数可以有多个输入输出。如function [y1,y2]=myfun(x1,x2,x3) 例1中的m文件可在第一行前插入一行:
function randplt
保存后则该文件成为一个没有输入输出宗量的函数。
一般来说matlab中执行同样的任务使用函数文件比脚本文件的效率高。
3.函数句柄的使用
函数句柄起到c语言中函数指针的作用。
例3: 编写函数求出数组arr1和arr2的标准差(std)以及误差(stderr)。 解: 编写如下文件并保存为erreval.m
function [s1,s2]=erreval_r(err,arr1,arr2)
% err为所调用的误差函数,s1,s2分别返回arr1和arr2的误差. s1=feval_r(err,arr1);
s2=feval_r(err,arr2);
此文件的输入包含"函数变量", 通过函数句柄实现函数变量err的赋值。 运行时先运行如下命令建立数组arr1,arr2:
arr1=[1;2;3];
arr2=[10;20;30];
然后输入
[std1,std2]=erreval_r(@std,arr1,arr2)
[stderr1,stderr2]=erreval_r(@stderr,arr1,arr2)
执行后返回四个误差值。
@std,@stderr为两误差函数的函数句柄。
Matlab 网站
http://wenku.baidu.com/view/799ac41dc281e53a5802ffc9.html 你打开看看,中间有求二元极值的例子
http:///forum.php
篇三:matlab指令
1.applylut
功能:
在二进制图像中利用lookup表进行边沿操作. 语法:
A = applylut(BW,lut)
举例
lut = makelut('sum(x(:)) == 4',2);
BW1 = imread('text.tif');
BW2 = applylut(BW1,lut);
imshow(BW1)
figure, imshow(BW2)
相关命令:
makelut
2.bestblk
功能:
确定进行块操作的块大小.
语法:
siz = bestblk([m n],k)
[mb,nb] = bestblk([m n],k)
举例
siz = bestblk([640 800],72)
siz =
64 50
相关命令:
blkproc
3.blkproc
功能:
MATLAB高级应用——图形及影像处理 320 实现图像的显式块操作.
语法:
B = blkproc(A,[m n],fun)
B = blkproc(A,[m n],fun,P1,P2,...)
B = blkproc(A,[m n],[mborder nborder],fun,...)
B = blkproc(A,'indexed',...)
举例
I = imread('alumgrns.tif');
I2 = blkproc(I,[8 8],'std2(x)*ones(size(x))'); imshow(I)
figure, imshow(I2,[]);
相关命令:
colfilt, nlfilter,inline
4.brighten
功能:
增加或降低颜色映像表的亮度.
语法:
brighten(beta)
newmap = brighten(beta)
newmap = brighten(map,beta)
brighten(fig,beta)
相关命令:
imadjust, rgbplot
5.bwarea
功能:
计算二进制图像对象的面积.
语法:
total = bwarea(BW)
举例
BW = imread('circles.tif');
imshow(BW);
附录 MATLAB图像处理命令 321
bwarea(BW)
ans =
15799
相关命令:
bweuler, bwperim
6.bweuler.
功能:
计算二进制图像的欧拉数.
语法:
eul = bweuler(BW,n)
举例
BW = imread('circles.tif');
imshow(BW);
bweuler(BW)
ans =
-2
相关命令:
bwmorph, bwperim
7.bwfill
功能:
填充二进制图像的背景色.
语法:
BW2 = bwfill(BW1,c,r,n)
BW2 = bwfill(BW1,n)
[BW2,idx] = bwfill(...)
BW2 = bwfill(x,y,BW1,xi,yi,n)
[x,y,BW2,idx,xi,yi] = bwfill(...)
BW2 = bwfill(BW1,'holes',n)
[BW2,idx] = bwfill(BW1,'holes',n) 举例
MATLAB高级应用——图形及影像处理 322 BW1 =[1 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0
1 0 0 0 1 0 1 0
1 0 0 0 1 1 1 0
1 1 1 1 0 1 1 1
1 0 0 1 1 0 1 0
1 0 0 0 1 0 1 0
1 0 0 0 1 1 1 0]
BW2 = bwfill(BW1,3,3,8)
BW2 =
1 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 0 1 0
1 1 1 1 1 1 1 0
1 1 1 1 0 1 1 1
1 0 0 1 1 0 1 0
1 0 0 0 1 0 1 0
1 0 0 0 1 1 1 0
I = imread('blood1.tif');
BW3 = ~im2bw(I);
BW4 = bwfill(BW3,'holes');
imshow(BW3)
figure, imshow(BW4)
相关命令:
bwselect, roifill
8.bwlabel
功能:
标注二进制图像中已连接的部分.
语法:
附录 MATLAB图像处理命令 323
L = bwlabel(BW,n)
[L,num] = bwlabel(BW,n)
举例
BW = [1 1 1 0 0 0 0 0
1 1 1 0 1 1 0 0
1 1 1 0 1 1 0 0
1 1 1 0 0 0 1 0
1 1 1 0 0 0 1 0
1 1 1 0 0 0 1 0
1 1 1 0 0 1 1 0
1 1 1 0 0 0 0 0]
L = bwlabel(BW,4)
L =
1 1 1 0 0 0 0 0
1 1 1 0 2 2 0 0
1 1 1 0 2 2 0 0
1 1 1 0 0 0 3 0
1 1 1 0 0 0 3 0
1 1 1 0 0 0 3 0
1 1 1 0 0 3 3 0
1 1 1 0 0 0 0 0
[r,c] = find(L==2);
rc = [r c]
rc =
2 5
3 5
2 6
3 6
相关命令:
bweuler, bwselect
9.bwmorph
功能:
提取二进制图像的轮廓.
语法:
BW2 = bwmorph(BW1,operation) BW2 = bwmorph(BW1,operation,n) 举例
BW1 = imread('circles.tif');
MATLAB高级应用——图形及影像处理 324 imshow(BW1);
BW2 = bwmorph(BW1,'remove'); BW3 = bwmorph(BW1,'skel',Inf); imshow(BW2)
figure, imshow(BW3)
相关命令:
bweuler, bwperim, dilate, erode
10.bwperim
功能:
计算二进制图像中对象的周长.
语法:
BW2 = bwperim(BW1,n)
举例
BW1 = imread('circbw.tif');
BW2 = bwperim(BW1,8);
imshow(BW1)
figure, imshow(BW2)
附录 MATLAB图像处理命令 325
相关命令:
bwarea, bweuler, bwfill
11.bwselect
功能:
在二进制图像中选择对象.
语法:
BW2 = bwselect(BW1,c,r,n)
BW2 = bwselect(BW1,(转载自:www.xiaocaOfaNWen.com 小草 范 文 网:matlab,std2什么含义)n)
[BW2,idx] = bwselect(...)
举例
BW1 = imread('text.tif');
c = [16 90 144];
r = [85 197 247];
BW2 = bwselect(BW1,c,r,4);
imshow(BW1)
figure, imshow(BW2)
相关命令:
bwfill, bwlabel, impixel, roipoly, roifill
12.cmpermute
MATLAB高级应用——图形及影像处理 326 功能:
调整颜色映像表中的颜色.
语法:
[Y,newmap] = cmpermute(X,map)
[Y,newmap] = cmpermute(X,map,index) 举例
To order a colormap by luminance, use: ntsc = rgb2ntsc(map);
[dum,index] = sort(ntsc(:,1));
[Y,newmap] = cmpermute(X,map,index); 相关命令:
randperm
13.cmunique
功能:
查找颜色映像表中特定的颜色及相应的图像. 语法:
[Y,newmap] = cmunique(X,map)
[Y,newmap] = cmunique(RGB)
[Y,newmap] = cmunique(I)
相关命令:
gray2ind, rgb2ind
14.col2im