计算机本质上是一个能够处理数据的机器。Matlab 可以处理很多类型的数据,我们功利一点,先只了解最常用的几种数据类型。其他的数据类型,随用随查。
从这一次教程开始,大家要勤在命令行窗口中练习。
数值数据(Numeric)
可以把它理解为数学意义的数字。Matlab 默认把数值型数据按照双精度浮点型存储。咱们先不管什么是双精度浮点型,最直观的了解就是咱们在Matlab 中做数值计算时,它的精度是小数点后4位。
你可以试着在命令行窗口中输入以下命令,看看这样的数值计算(输入完命令后要按回车。在>>
符号后面是输入的内容,ans =
之类的内容,是 matlab 在执行命令后的输出,后文不再解释类似的输入与输出)。
>> 3 + 4
ans =
7
>> 3 / 4
ans =
0.7500
字符串(string)
以单引号'
或双引号"
括起来的任意文本,如'abc'
就是一个字符串,它包含a
, b
, c
三个字符,也可以写成"abc"
。
请注意,单引号或双引号只是字符串的边界,它并不包含在字符串当中。那如果字符串本身包含有单引号或双引号时怎么办?
这里存在两类情况,我们用写字符串I'm OK
和I"m OK
来举例.
- 如果字符串本身的引号与字符串边界的引号不同,则上述例子在程序中应该写成
'I"m OK'
和"I'm OK"
. - 字符串本身的引号与字符串边界的引号相同,则上述例子的写法就是这样的:
'I''m OK'
和"I""m OK"
. 注意字符I
后面的引号写了两次。
大家可以思考一下,如果字符串里面既包含'
也包含"
怎么办?
在 matlab 中用不同的方法试试:
>>'I"m OK'
ans =
'I'm OK'
>>"I'm OK"
ans =
"I'm OK"
>>"I""m OK"
ans =
"I"m OK"
>> 'I''m OK'
ans =
'I'm OK'
>> 'I''m "God"!'
ans =
'I'm "God"!'
字符串是文本,而计算机只能处理数字。所以需要先将文本转换为数字才能执行进一步的操作。这就涉及到编码,所有的文本先通过编码计算方案转换为数字再存储到计算机里。
最早的编码方案是美国人搞出来的,只负责127个字符(大小写英文字母加上一些符号和数字)的编码。这种编码方案被称为ASCII
编码。比如,在这个编码方案里,a
对应的数字是97
, b
对应的是98
. 所以,大家应该能理解下面的计算结果。
>> 'a' + 'b'
ans =
195
编码方案还有很多种,比如中国的汉字编码采用的是 GBK 编码,也有采用 GB2312 的,有兴趣的小伙伴们,可以自己去查一下。
逻辑型数据(bool)
逻辑型数据,很多人都习惯上把它称为布尔值。在 Matlab 中,它只有true
和false
这两个值,请注意大小写。Matlab 用1
表示true
,而用0
表示false
.
我们在命令行窗口中看看这一特性:
>> true
ans =
logical
1
>> false
ans =
logical
0
布尔值可以通过关系操作符计算得到,关系操作符主要有以下几种(如果对以下的判断回答为“是”,则结果为 true,否则结果为 false.):
-
==
判断两边的值是否相等; -
~=
判断两边的值是否不等; -
>
判断左边的值是否大于右边的值; -
<
判断左边的值是否小于右边的值; -
>=
判断左边的值是否大于等于右边的值; -
<=
判断左边的值是否小于等于右边的值。
请看例子:
>> 3 == 5
ans =
logical
0
>> 3 ~= 5
ans =
logical
1
>> 3 > 5
ans =
logical
0
>> 3 <= 5
ans =
logical
1
多个关系计算式可以通过逻辑运算符连接得到更复杂的逻辑表达式。逻辑运算符主要有以下三种:
-
&
逻辑与(AND),只有当&
两边的值都为 true 时,结果才为 true. -
|
逻辑或(OR),当|
两边的值中至少有一个为 true时,结果为 true. -
~
逻辑非(NOT),它是单目操作符,也就是~A
的形式。如果A为true,则~A
为 false. 反之则为 true.
结合例子进一步理解:
>> 3 | 5
ans =
logical
1
>> -1 & 0
ans =
logical
0
>> 'a' | 0
ans =
logical
1
>> ~'c'
ans =
logical
0
>> ~0
ans =
logical
1
这里可能有小伙伴比较懵,几个意思?前面说过,true 被 Matlab 存储为1
,而false被存储为0
. 更进一步,在逻辑运算过程中,Matlab 将所有的非零数据都当作是 true.
继续看例子:
>> (~ (2 > 3)) & (3 <= 4) | (5 > 3)
ans =
logical
1
这里用了括号,以提高某些块的运算优先级(跟数学里做的一样,都是先算括号里的,然后才算其他的)。可以想一想,如果我写成这样:~ 2 > 3 & 3 <= 4 | 5 > 3
,大家能一眼看出先算哪个,后算哪个吗?
为了避免歧义,勤用括号就没错。&
, |
, ~
这三种运算符的运算的规则是从左至右,其他的优先级关系我们就不管了,留着脑容量处理更重要的事情。
逻辑运算常常用于循环或条件判断中。比如:
if 5 > 3
disp ('OK')
end
如果5 > 3
,就显示OK
.
while 3 < 5
disp ('x smaller than y')
end
这是一个循环操作,只要3 < 5
就一直显示3 smaller than 5
. 这个例子,是一个死循环,也就是说它会一直这么执行下去,除非强制终止(在Matlab中是按ctrl
+ c
键)。实际工作中,很少这么写。
变量
变量的概念与初中代数中变量概念几乎是相同的。只是在计算机程序中,变量可以是任意的数据类型。在程序中,使用变量名来表示变量。顾名思义,变量名就是变量的名称。变量名不能乱取,在 Matlab 中,变量的命名必须遵守以下规则:
- 第一个字符必须是英文字母
- 可以是数字、英文字母以及下划线
_
的组合 - 长度不超过63个字符
- 大小写敏感,也就是说变量
cost
与变量Cost
,COsT
等是不一样的。 - 有 20 个单词是 Matlab 内置的关键字,这些关键字不能用作变量名。具体是哪 20 个单词,大家可以使用
iskeyword
命令查看。
可以通过赋值操作符=
将数据赋值给变量。
a = 3
b = '2'
c = 'hello world'
d = true
注意,这里的=
与数学里的=
不一样。
本质上,变量是一个指针,通过指针的指向我们可以获取变量的值。赋值操作只是改变了这个指针的指向。
我们试着用以上知识来理解下面的结果:
>> a = 5
a =
5
>> a = a + 3
a =
8
>> b = a
b =
8
>> a = 'Hello world!'
a =
'Hello world!'
>> disp (b)
8
第一次,Matlab 创建了一个变量a
和数据5
,并且通过赋值操作,将变量a
指向数据5
;
第二次,先将a
指向的数据5
加上3
,得到8
,通过赋值操作,将变量a
指向了新的数据8
;
第三次,Matlab 创建了一个新的变量b
,通过赋值操作,变量b
与变量a
指向同一个数据8
. 注意了,这里两个变量指向了同一个数据。
第四次,Matlab 创建了一个字符串数据Hello world!
,通过赋值操作,将变量a
指向了这个字符串数据。注意了,虽然变量a
的指向发生了变化,但是b
仍然是指向数据8
的。
最后,用disp
命令查看下b
的值是什么。