用一个变量对另一个变量进行初始化,如果不进行类型转换,则被初始化的变量将和用于初始化的变量的类型一致,看下面的例子:
显然,b得到的不是我们想要的答案,因为a向量中的元素为uint8类型的,如果直接相加并赋给b,Matlab是不会因为溢出而把类型进行扩展的,因此在预测到会溢出时应事先进行类型转换,否则就得不到正确数据。例如我在对图像进行二维傅里叶变换时没注意到这个问题,导致每次变换后图像几乎是一片黑,我郁闷了半天。
后来发现原来是因为直流分量本来很大,但由于没有进行类型转换,导致直流被活生生地截掉了。
![Matlab中的细节问题及技巧(持续更新) Matlab中的细节问题及技巧(持续更新)](https://i-blog.csdnimg.cn/blog_migrate/676ebda4729556d2ae74a2569eb85a7a.gif)
类型转换格式如下:
>> a=[256 3 500 -1]
a =
>> b=uint8(a);
>> b
b =
a是double型的,要转换成uint8型时,大于uint8类型最大值255的就变成255,小于uint8型最小值0的,就变为0,其他不变。
函数islogical用来判断数据是否是logical型的,用法是
若a为logical的,则返回1,否为为0
图像类和类型间的转换函数主要有:
名称:
输出类型:
输入类型
im2uint8
uint8
logical,uint8,uint16,double
im2uint16
uint16
logical,uint8,uint16,double
mat2gray
double(在0到1之间)
double
im2double
double
logical,uint8,uint16,double
im2bw
logical
uint8,uint16,double
用法直接查看Manual就好。
直接上例子>> a=[1 2;4 3]
a =
>> a(1:end)
ans =
>> a(:)
ans =
没错:a(1:end)产生行向量,a(:)产生列向量
其实a(:)有一个很重要的用法,就是对一个数组进行重新变为a的形状。前提是两者元素数量相等。
例子:
a =
>> b=[1 2 3 4 5 6]
b =
>> a(:)=b
a =
b不限于向量,也可以是3*2的数组。
4.Matlab中句柄的使用
在《WINDOWS编程短平快》(南京大学出版社)一书中是这么说的:句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。
从上面的2个定义中我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的。它就像我们的车牌号一样,每一辆注册过的车都会有一个确定的号码,不同的车号码各不相同,但是也可能会在不同的时期出现两辆号码相同的车,只不过它们不会同时处于使用之中罢了。从数据类型上来看它只是一个32位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。
比如定义f(x)=x^2,可以写为
f=@(x)(x.^2)
其中@(x)(x.^2)就是匿名函数,第一个括号里面是自变量,第二个括号里面是表达式,@是函数指针
f=@(x)(x.^2)表示将匿名函数@(x)(x.^2)赋值给f,于是f就表示该函数。
于是f(2)=2.^2=4;f(1:3)=[1:3].^2=[1 4 9]等等
定义匿名函数时也可以调用别的匿名函数,比如
f1=@(x,y)(x.^2+y.^2)
定义了函数x^2+y^2
f2=@(t)(f1(t,2))
定义了函数t^2+4
f3=@(x)(f1(x(1),x(2)))
定义了函数x(1)^2+x(2)^2
使用匿名函数时一定要注意函数本身的参数形式,如
f1(2,3)
表示2^2+3^2
f2(3)=3
表示3^2+4
f3([1,2])
表示1^2+2^2
说白了就是函数指针
ps:这里还是有点晕,句柄到底是不是函数指针?