1 Matrces and Arrays
matlab中一些都是以多维数组的形式存储的,矩阵只不过是一个二维数组,还可以有多维数组;
数组(可以看成是单行多列的矩阵)的创建方法:
(1)a = [1 2 3 4] 或 a=[1,2,3,4]
(2)a = [1 2 3; 4 5 6; 7 8 10] 一个矩阵
(3)z = zeros(5,1) 一个5乘1矩阵,其中 zeros 是一个函数,生成的矩阵元素都是0,相应的还有ones,rand等函数
矩阵的操作:
1. 矩阵与普通的数(1X1的数)
a+2 a-2 a*2 a/2 都是对矩阵中每一个元素起作用,感觉正规的写法应该是:
a.+2 a.-2 a.*2 a./2 a.^2
就是说对矩阵中每个元素执行这些操作,主要用在两个矩阵时,比如
a=[1,2;3,4] b=[1,2;3,4] 那么 a*b 这就是执行矩阵的相乘操作,而不是元素之间的相乘,
如果想进行元素之间的相乘则需要 a.*b 即可。
matlab都是由double来存储数据,使用format 命令可以调整显示的位数,即小数点后有多少位,这个只调整显示的位数并
不改变内部的存储。
format命令可以在帮助文档的 Language Fundamentals 中找到。
两个矩阵的连接:[] 其实我们一直在使用[],看两个例子就行了;
A = [a,a]
A =
1 2 3 1 2 3
4 5 6 4 5 6
7 8 10 7 8 10
A = [a; a]
A =
1 2 3
4 5 6
7 8 10
1 2 3
4 5 6
7 8 10
一个行连接,一个列连接,其时我们在定义矩阵时 a=[1,2,3;4,5,6;7,8,9]用的不就是连接吗。
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
A(4,2) = 14;
A(8)=14;
A(2)=5;
A(1:3,2) =
2
11
7
A(3,:)
ans =
9 7 6 12
B = 0:10:100
B =
0 10 20 30 40 50 60 70 80 90 100
这个定义是步近的,是一个等差数列,d = 10;
数组下标越界,比如上面的A,不能这样访问 A(4,5)。但是可以这样A(4,5) = 100;
这时A矩阵会自动扩张,成为如下所示:
A =
16 2 3 13 0
5 11 10 8 0
9 7 6 12 0
4 14 15 1 100
这个特征是很用的,比如说我们刚开始,定义一个空的向量 v = [],我们可以把它当做一个可以自动增长的数组来使用;
同时它也可以自动缩减,比如 v = v(1,1:5); 这对我们来说简直就是一个堆栈或队列了。
可以使用 clear 清楚workspace中的所有变量;用 clc 函数清空屏幕;
可以使用 save *.mat 命令把变量持久化到文件系统,即使退出matlab也不会丢失;
如果使用 save(filename)保存当前工作环境下的所有变量到文件中, save(filename, variables) 保存指定变量到文件中
,
save(filename,variables,'-append') 追加变量到文件中,举例如:save('test.mat', 'c', '-append') 追加变量c到
test.mat中;
可以使用load *.mat 把保存的变量加载到空间中;
当然也可以只加载某个变量,使用 load(filename, variables)
下面看一看字符串如何操作:
myText = 'Hello, world';
可以直接连接字符串,
longText = [myText,' - ',otherText]
num2str(c) 把数字转化成字符串,然后可以和其它字符串进行连接了;
画图:二维图 用 plot 函数,它有三个参数,具体可以看help, 其中一个参数是 x 的取值,一般都是离散的,不可能全连
续分布,总有个步进;y就是x的函数了,matlab会自动计算y的值,并把结果在对应的坐标上标出。第三个参数用来设置线
的显示方式,具体可以设置值可以通过 help plot 查看,现在简单记录: 可以变化 线的颜色,在帮助文档列出的颜色中随
意选一个,可以选择线的样式,可以这样理解:因为 x 总是离散的,虽然间隔很小,离散的两个点之间可以通过一个线相
连接,而这个连接的线的样式可以设置,设置方式也是在帮助文档的列表中选取一个,有实线,虚线等;另一方面由于x是
离散的,虽然两点之间可以通过线连接,但matlab还可以在每个离散点标记一个符号,比如是‘+’号等,有很多种符号可
以设置,具体可以查文档。总之:线的颜色,线的类型,离散点的标记符号都可以设置,通过一个字符串完成,比如'r-+'
表示用红色线连接两点,线的类型是实线,每个离散点上的符号为 '+'号。具体用法可以自己实验一下,实验时最好让x 的
步进大一点,这样可以看的比较清楚(LineSpec 如下图所示)。
看下面的图如何画: plot([1,2],[10,11]) 应该比较好画,x1->y10, x2->y11, 但如果是 plot([1,3],[10,11])要如何画
,因为x从1->3分成两份,1->2,2->3,所以(11-10)/2 即为 y 对应于x的步进,具体可以实验一下; 而plot([1,10],
[5,5]) 就是画一条直线了,y的值始终是5.
plot(Y) creates a 2-D line plot of the data in Y versus the index of each value.
If Y is a vector, then the x-axis scale ranges from 1 to length(Y).(如果Y是一个向量,x轴默认范围)
If Y is a matrix, then MATLAB plots the columns of Y versus their row number. The x-axis scale ranges from 1
to the number of rows in Y.(画一个矩阵,具体可以参照 doc plot 中的一个例子)
x = -pi:pi/20:pi;
plot(sin(x))
hold on //hold on 是把两个图形画在同一个 Figure中,系统会自动调整x轴和y轴的范围,以容纳两个图形
plot(cos(x)) //把 cos(x)和 sin(x)画在同一个图形中
hold off //hold 在默认情况下是关闭的,所以在打开以后要关闭
ezplot主要用来画隐函数,比如 x^2-y^4 = 0, 这种函数,很难找出 y = 什么x,即使找到也存在多值等问题,这时可以
ezplot('x^2-y^4') 来画它,默认的域范围为 -2*pi 到 2*pi,即 the default domain -2π < x <2π, -2π < y < 2π.
plot3用来绘制3维图形,但并不常用,下面给出一个例子
>> t = 0:pi/50:10*pi;
>> plot3(sin(t),cos(t),t)
>> xlabel('sin(t)')
>> ylabel('cos(t)')
>> zlabel('t')
>> grid on //打开三维中的窗格,实验就知道作用
plot3用来画一条曲线,有时候我们需要通一个曲面看函数的走向,这时需要使用 surf函数及相应的等高线;
在3维空间中如果要画一条曲线,我们只需要知道 (x,y,z)的值即可,把N个三维空间中的点联结起来就是一个曲线,
如(1,1,2),(2,2,3),(3,3,8)等等,这些点联结起来。当要画面的时候要相对复杂一些,为什么呢?
假设我们要画出如下的函数 z = x*e^(-x^2-y^2),它的曲面图如下图(曲面图.png):
为了得到这个区面,假设我们取点 x = -2 -1 0 1 2, y = -2 -1 0 1 2,为了画出曲面,我们需要连续计算如下点的
z 值
(-2,-2),(-2,-1),(-2,0),(-2,1),(-2,2)
(-1,-2),(-1,-1),(-1,0),(-1,1),(-1,2)
(0,-2),(0,-1),(0,0),(0,1),(0,2)
(1,-2),(1,-1),(1,0),(1,1),(1,2)
(2,-2),(2,-1),(2,0),(2,1),(2,2)
所以我们最后得到的 z值是一个矩阵形式的,这样就可以很方便的画图,相应的为了组合出上述的形式,我们的x和y
也应该是一个矩阵形式,如下
>> [x,y]=meshgrid(-2:2)
x =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
y =
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
只所以使 x,y是矩阵形式,主要为了方便得到上述的 z 矩阵。下面是一个例子:
>> [x,y]=meshgrid(-2:2)
x =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
y =
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
>> z = x.*exp(-x.^2-y.^2);
>> surf(x,y,z)
图形如下:
由于点太少,所以曲面不明显,下面对上例进行细化,具体如下所示(参考博客:http://huzhyi21.blog.163.com/blog/static/1007396201061052214302/):
>> x=linspace(-2, 2, 25); % 在x轴上取25点
y=linspace(-2, 2, 25); % 在y轴上取25点
[xx,yy]=meshgrid(x, y); % xx和yy都是21x21的矩阵
zz=xx.*exp(-xx.^2-yy.^2); % 计算函数值,zz也是21x21的矩阵
surf(xx, yy, zz); % 画出立体曲面图
图形如下:
========================待添加===============================