基本数据类型
几条秘籍:
1.直接赋值,无需定义类型
2.字符串或字符用单引号
eg: msg = ‘Hello World’
whos:查看工作区的变量
clear all:清除工作区所有的变量
clc : 清屏
matlab的数据类型和c差不多,只不过对于int类型具有更多的内存大小选择空间。int/uint具有8,16,32,64位的选择,如unit8,范围为0到255,;又如int16是-32768~32767
其他类型:
1. single 单精度浮点,内存4字节
2. logical 布尔类型,等同于boolean
默认情况下,matlab将变量存为双精度,但是在图像处理中,一般要用到unit8,所以要强制转换。
>> a = 1;
>> b = uint8(a)
有时候得到一些变量的值,想存储下来已被后续使用。可以用save和load
如:
>> a = 1;
>> b = uint8(a)
>> save (‘ha1.mat’,’a’,’b’)
%将工作区的a和b存储到ha1.mat文件中,当然可以不指定参数,就会将所有的变量存储。
>>clear all
>>a
此时,出现 ??? Undefined function or variable ‘a’.
如果加载
load (‘ha1.mat’)
a
则显示
>>a =
>> 1
等间隔矩阵
v = [2:1,10]
v =
2 3 4 5 6 7 8 9 10
注意:两边都是闭的,如果是间隔为1,直接写成v=[2:10]
主要函数:
eye 单位矩阵
zeros 全为0矩阵
ones 全为1矩阵
rand 均为分布随机矩阵
randn 正态分布随机矩阵
eg: a = randn(5)
a =
0.8404 -0.6003 -2.1384 0.1240 2.9080
-0.8880 0.4900 -0.8396 1.4367 0.8252
0.1001 0.7394 1.3546 -1.9609 1.3790
-0.5445 1.7119 -1.0722 -0.1977 -1.0582
0.3035 -0.1941 0.9610 -1.2078 -0.4686
有时候你要看某个矩阵的大小,比如看第一维有多大,那么可以用size
size(A,dim) :dim为要查看的维数
看矩阵有几维用ndims(A)
A为3行5列的矩阵,那么
size(B,2) = 5;
size(B) = [3,5]
ndims(B) = 2
注意:matlab矩阵是从1开始的!!!
显然提取对于二维数组,A(1,2)就是那个元素。但是如果要访问某一行或是某一列时,咋办呢?
利用“, :”或是“:,”就可以了。
A = [1 2 3; 4 5 6; 7 8 9];
k1 = A(1,:);
此时:k1 =
1 2 3
也就是说返回的是一个行向量,将A的第一行提取出来了。同理可以提取列。如:k2 = A(: , 3);
k2 =
3
6
9
类似的还有
1. A(m1:m2,n1,n2)
2. A(:) 将矩阵存为一个长的列向量
再如:inputSize = magic(3)
input =
8 1 6
3 5 7
4 9 2
>> input(1:5)
ans =
8 3 4 1 5
我们都知道,矩阵的乘法是,比较麻烦的,得到矩阵的i行j列是第一个矩阵的i行的对应的数乘以第二个矩阵的j列对应的值,再求和。但是有时候我们就像让矩阵对应位置的数相乘,这时候是“.*“。
类似的还有:
1. .^ 每一个元素进行乘方
2. .\
3. ./
运算符 名称 说明
/ 右除 AB=C A=C/B
\ 左除 AB=C B=A\C
记忆方法:左除A\C inv(A)*C
右除 C/B B*inv(C)
randperm, range, min/max/mean, size/length/numel/ndims, sum/prod, var/std, repmat, reshape,,bsxfun, cellfun,structfun,arrayfun等
值的注意的是,这些函数大部分有DIM参数,即所谓的“沿着第DIM维运算”,如:
c = [1 2; 3 4]; sum(c, 1)为[4, 6],此时有2列,而行被压扁成1行; 而sum(c, 2)为[3; 7],此时行数为2,而列数为1。可以这样想:“沿着”就是这一维的下标从1到最大值,其他维不变,进行函数运算。形象点就是说这一维被压扁了,只剩下一个了。另外matlab是按列填充数字的,比如c(3)是2,c(2) 是3,但第一维仍旧是行!!
一般来说我们返回一种数据类型,有时候我们想返回多个维度的值。细胞数组是一种特殊的数据类型。相当于python的list,内部可以是任意类型,通过下标访问
>> a ={‘a’,1,[1:4] }
a =
'a' [1] [1x4 double]
>> a{3}
ans =
1 2 3 4
细胞数组用“{}”来定义,通过“{}”来访问元素。
这个其实和c语言的结构体是差不多的。直接通过“.“来定义和访问。
可以这样认为,在细胞数组的基础上加上了属性,而细胞数组相当于结构体中的各属性的值的集合,而缺失了属性。
a.Name=’a’;
a.Age=1;
a.list=[1:4]
…
举个例子:
>> stu.book = {‘War’,’Peace’};
>> stu.name=’xiao’;
stu =
book: {'War' 'Peace'}
name: 'xiao'
几个函数:
fieldnames(student); %返回字段名(此处返回 ‘book’和’name’)
isfield(student,’age’);
isstruct(student);
struct2cell(student);
>> stuCell =struct2cell(stu)
stuCell =
{1x2 cell}
'xiao'
% cell中用’{ }’是得到内容
>> stuCell{1}
ans =
'War' 'Peace'
% cell中用’( )’是得到成员
>> stuCell(1)
ans =
{1x2 cell}
其实没啥好说的,就是一点:“非”用“~”,例如:不等于“~=”,另外“!”不是matlab的阶乘。。
流程控制
rank 求矩阵秩
简单一句话,一个流程中只有一个end!
如:
在图像处理中,经常会用到meshgird函数,其主要是根据给定的横纵坐标生成网络。
[X,Y]= meshgrid(x,y)
典型用法:
例如二维高斯函数:
函数编写
一般来说,格式为:
function [outputs] = name(inputs)
如果是返回多个,就要用[]来括起来,如果值返回一个的话,就类似js的函数写法:
如: