碎碎念
谁知道,我居然半路开始学MATLAB,我会写C,C++,Java,Javascript,VUE,python,octave但是我没用过MATLAB。然后今天W老师布置了一个数据挖掘的任务,要求必须用MATLAB写。我就开始了痛苦的学MATLAB之路。教程已经看一半了。写一下数组处理以及遇到的坑。
我发现MATLAB和octave及其相似,之前我写过Octave简明教程,感兴趣的可以看一下。octave算是MATLAB的平替,octave开源并且免费,如果没有强制要求,同志们可以使用octave代替MATLAB。
基础操作
声明数组
声明一个向量或者数组很简单,使用`(空格)或者
,(逗号)分割每行元素,使用
;`(分号)分割每列元素。
x = [7 9]
x=[7,9]
x = [7, 9]
上边三个语句都是创建一个行向量x
。
同理生成数组。
初始化数组使用ones(维度)
、zeros(维度)
、rand(维度)
,分别对用用1生成,用0生成,以及随机初始化。还可以使用magic(n)
生成n阶幻方矩阵。
除此之外还可以使用区间进行初始化,需要注意的是这个和python不一样,在这里都是闭区间,语法如下:
start:end
分别指定起始结束位置。start:step:end
起始位置,结束位置以及步长。linspace(start,end,number)
其实位置,结束位置以及要生成的元素个数,系统会自动给你计算步长。
数组拼接
这个和用数字生成数组一样搞,使用`(空格)或者
,(逗号)横向拼接两个数组,记住维度要能合得来,使用
;`(分号)纵向拼接数组。
数组索引
这里需要特别特别注意几点,
- 和别的语言都不太一样,matlab索引是1-index,也就是从1开始数的,而我接触的其他语言都是从0开始的。
- python里可以使用负数作为索引,比如-1代表从后数第一个元素。在MATLAB中也有相同的操作,但是不是使用-1,是使用
end
。
获取单个数值和其他语言一样,找到对应位置即可。
使用:
进行索引,跟python差不多也可使用冒号进行索引:
单独一个冒号表示所有,start:end
也可以指定开始和结束的范围。
当然也可以仅指定一个维度上的索引进行数组切片, MATLAB会自动将数组扁平化之后激进型输出,扁平化的顺序是纵向连接。
获取不连续位置的数字,这是我遇到坑的地方,还百度了一下,因为教程提示我
我迷惑了一下,以为不连续的是要用方括号代替圆括号进行索引,实际上是给圆括号传入一个行向量,向量填充方法和平时使用打印机打印不同页的东西一个规则,比如:
数组存储及修改
先说修改,对于数组的修改直接使用对应位置的索引进行数值替换即可。
在这里普通的切片数组空间是独立开辟的,也就是说一个变量的改变不会引起另一个变量的变动。
做个题验证一下成果
随机初始化一个大小为7*4的矩阵,并将最右上角的数字改为π(=3.1415...)
- Create a vector named v2 containing the last column of data.
- Change the first element in v2 from NaN to 0.5.
- Change the value of the element in the first row and last column of data to 0.5.
答案:
计算
按位运算
使用使用运算符与单个数字进行计算或者内置函数是对数组进行按位运算。
*两个矩阵之间的按位相乘运算需要在`运算符之前加上
.`**。
广播机制
学过python的应该了解广播机制,当然也有没学过的,我在这里解释一下什么是广播机制(broadcast):
在按位计算中一个自觉的矩阵应该学会自适应维度进行计算。 当然这个自适应是有前提的,必须是有向量长度和矩阵的某一维度相同才行,不可能出现那种各种维度不同的矩阵自动取最小公倍数进行计算的。
比如:
矩阵乘法
除了按位置计算矩阵乘法,剩下的就是正常计算了,$R^{m\times s} \times R^{s\times n} = R^{m\times n}$。