Octave命令及语法教程2 - 数据的计算(矩阵乘法、求逆、转置)

Octave命令及语法教程2 - 数据的计算(矩阵乘法、求逆、转置)

矩阵运算

矩阵乘法

我们先来创建三个矩阵:A、B、C:

> A = [1 2; 3 4; 5 6]
A =

   1   2
   3   4
   5   6

> B = [11 12; 13 14; 15 16]
B =

   11   12
   13   14
   15   16

> C = [1 1; 2 2]
C =

   1   1
   2   2

A*C:矩阵A和矩阵C相乘

> A*C
ans =

    5    5
   11   11
   17   17

.的使用

A .* B: 矩阵A和矩阵C每个对应元素分别相乘

> A .* B
ans =

   11   24
   39   56
   75   96

上面提到的.指的是对每个元素的操作,再举个例子,对A的每个元素平方:

> A .^ 2
ans =

    1    4
    9   16
   25   36

再举个例子:

> v = [1; 2; 3]
v =

   1
   2
   3

> 1 ./ v
ans =

   1.00000
   0.50000
   0.33333

> 1 ./ A
ans =

   1.00000   0.50000
   0.33333   0.25000
   0.20000   0.16667

log()

对每个元素进行对数运算:

> log(v)
ans =

   0.00000
   0.69315
   1.09861

exp()

对每个元素求e^x

> exp(v)
ans =

    2.7183
    7.3891
   20.0855

abs()

对每个元素求绝对值

> -v
ans =

  -1
  -2
  -3

> abs(-v)
ans =

   1
   2
   3

上面的-v也就相当于-1 * v,不过可以直接写成-v

组合操作

> v + ones(length(v),1)
ans =

   2
   3
   4

ones(a,b)就是构建一个a行b列每个元素都是1的矩阵,而length(v)之前讲过,就是v的行数或列数最大的那个值,在这里是3,也就相当于v + ones(3,1),也就是将v的每个元素都加1。当然这样操作也都是一样的结果:

> v + 1
ans =

   2
   3
   4

> v .+ 1
ans =

   2
   3
   4

矩阵转置

在数学上我们用上标T表示转置,在Octave中,用'表示:

> A
A =

   1   2
   3   4
   5   6

> A'
ans =

   1   3   5
   2   4   6

(A')'依然是A,或者省略括号:A''也是可以的

max()

对于向量,返回最大的元素(以及索引)

> a = [1 15 2 0.5]
a =

    1.00000   15.00000    2.00000    0.50000

> max(a)
ans =  15
> [val, idx] = max(a)
val =  15
idx =  2

对于矩阵,返回的是每一列最大的数,是一个列数x1的行向量,每个元素是所求矩阵每一列的最大值。

> F = [1 2; 3 3; 2 4]
F =

   1   2
   3   3
   2   4

> max(F)
ans =

   3   4

> [val, idx] = max(F)
val =

   3   4

idx =

   2   3

注意:这里[val, idx] = max(F)类似Python中的多变量同时返回、赋值的操作,但是注意,不可像Python一样直接a, b = max(F),这里一定要加[]

还可以max(A,B)比较两个矩阵相同位置的元素大小,取大的那个,最后返回一个矩阵。

A =

   7   2   3
   7   5   6
   7   8   9

> B
B =

   11   12    1
   13   14    2
   15   16    3

> max(A,B)
ans =

   11   12    3
   13   14    6
   15   16    9

返回一个向量,每个元素是每一列的最大值

> A
A =

   7   2   3
   7   5   6
   7   8   9

> max(A,[],1)
ans =

   7   8   9

当然,有列最大值就有行最大值,我们只需要将最后一个参数1,改为2即可:

> max(A,[],2)
ans =

   7
   7
   9

其实,max(A)max(A,[],1)返回是一样的。

我们也可以求矩阵所有元素的中的最大值,只要先用max(A)求出每列最大,然后对返回的向量再max一下即可:

> max(max(A))
ans =  9

其实,这样相当于:

> max(A(:))
ans =  9

(:)之前说过的哦,下面还会提到,请记住这个小东西哦。

magic()

跟名字一样,这个函数非常神奇而有魔力,它返回一个方阵,每行元素、每列元素、对角线元素的和都是相同的。不过,你不必去自己计算验证他,后面我们讲到的sum函数会帮你验证。

> magic(3)
ans =

   8   1   6
   3   5   7
   4   9   2

逻辑判断与find()

> a
a =

    1.00000   15.00000    2.00000    0.50000

> a < 3
ans =

  1  0  1  1

a < 3返回跟原来一样大小的矩阵或向量,每个元素对应的位置满足条件为1,你不满足为0。

我们还可以结合find()来选取满足条件的元素索引

> find(a < 3)
ans =

   1   3   4

而对于矩阵

> find(magic(3) >= 7)
ans =

   1
   6
   8

直接返回一个变量,则是按照将所有元素排成一列时的索引,也就是相当于之前说的(:),像这样

> magic(3)(:)
ans =

   8
   3
   4
   1
   5
   9
   6
   7
   2

数一下,是不是像上面返回的那样:第1、6、8个元素>=7,很显然是的。

> [r, c] = find(magic(3) >= 7)
r =

   1
   3
   2

c =

   1
   2
   3

返回两个变量呢,第一个返回值是行索引,第二个返回值是列索引,两个返回的向量length是一样的,我们只需要对应取值即可,也就是r取1,c取1,即第一行第一列,r取3,c取2,即第三行第二列,r取2,c取3,即第二行第三列,也就是说这三个元素满足>=7

sum()

求和函数

> a
a =

    1.00000   15.00000    2.00000    0.50000

> sum(a)
ans =  18.500

与上面讲的max类似,sum对矩阵来说,sum(A)sum(A,1)一样,求每一列的和,返回一个向量。当第二个参数改为2的时候,就是对每一行求和,返回一个向量。

> A = magic(4)
A =

   16    2    3   13
    5   11   10    8
    9    7    6   12
    4   14   15    1

> sum(A)
ans =

   34   34   34   34

> sum(A,2)
ans =

   34
   34
   34
   34

每行每列和都一样,这样印证了前面谈到的magic函数

当然,也可以像max求矩阵最大值一样,来求矩阵所有元素的和:

> sum(sum(A))
ans =  136
> sum(A(:))
ans =  136

是不是有点温故知新的感觉了?不过还是要自己多练习哦。

对角阵

如何把一个矩阵变成只留正(主)对角元素,其他元素都变0的对角阵呢?这里正好复习一下之前讲的.eye

> A = magic(4)
A =

   16    2    3   13
    5   11   10    8
    9    7    6   12
    4   14   15    1

> A .* eye(4)
ans =

   16    0    0    0
    0   11    0    0
    0    0    6    0
    0    0    0    1

再结合前面的sum求一下矩阵正(主)对角元素的和:

> sum(sum(A.*eye(4)))
ans =  34

咦~ 有没有发现也是34,跟前面行列求和的结果一样,所以magic果然名不虚传。

flipud

主对角变副对角。其实就是以中间一行为轴,上下翻转。可能我表达能力不强,描述的不是很清楚,举个生动形象的栗子:小学的时候用的那种竖着翻的作业本,你把一页翻过去,然后看翻过去这页的反面。这个函数就是做了个翻作业本的事情,哈哈~

> flipud(eye(4))
ans =

Permutation Matrix

   0   0   0   1
   0   0   1   0
   0   1   0   0
   1   0   0   0

然后我们趁机求一下副对角元素的和:

> sum(sum(A.*flipud(eye(4))))
ans =  34

嗯,果然不出你所料,也是34。

pinv - 矩阵的逆(求逆矩阵)

> A = magic(3)
A =

   8   1   6
   3   5   7
   4   9   2

> pinv(A)
ans =

   0.147222  -0.144444   0.063889
  -0.061111   0.022222   0.105556
  -0.019444   0.188889  -0.102778

矩阵x矩阵的逆

> A * pinv(A)
ans =

   1.0000e+00  -1.1713e-14   6.3283e-15
   4.1633e-17   1.0000e+00  -1.1102e-16
  -5.9119e-15   1.2490e-14   1.0000e+00

学过线性代数的小伙伴可能说,这不对啊,结果应该是E(单位阵),这个不是呀!别慌,这个事情下次再谈,记着欠你一个解释哦。

prod

相乘之和

> prod(a)
ans =  15

floor

向下取整

> floor(a)
ans =

    1   15    2    0

ceil

向上取整

> ceil(a)
ans =

    1   15    2    1
猜你喜欢
什么是机器学习
阅读 164

机器学习,简单地说就是拟人。人工智能包含机器学习,而机器学习又包含深度学习。机器学习在我们的生活中有很多的应用,像自动驾驶、搜索引擎、谷歌翻译、垃圾邮件识别等等。

Mac如何安装MATLAB破解版
阅读 498

MATLAB是matrix和laboratory的组合,意为矩阵实验室,是一款特别好用的数学软件,尤其是对机器学习、人工智能。今天介绍一下Mac下安装MATLAB破解版教程。据说Mac上的matlab更丝滑。

Mac、Windows、Ubuntu(Linux)如何下载安装Octave
阅读 332

Octave是一款免费的开源软件,或者说Octave是一门科学编程语言。Octave有强大的数学导向语法,内置绘图和可视化工具,可以运行在GNU / Linux,macOS,BSD和Windows上,与Matlab脚本兼容。

Octave命令及语法教程1 - 数据的导入、存储、移动
阅读 213

这节课的内容 能让你明白 在 Octave 中 怎样用几句简单的命令 很快地对数据进行移动 包括加载和储存一个向量 或矩阵 加载和存储数据 把矩阵放在一起 构建更大的矩阵 用索引对矩阵某个特定元素进行操作等等

Octave命令及语法教程3 - 图像绘制与数据可视化
阅读 263

当开发学习算法时 图像可以让你更好地理解算法的内容 检查算法是否正常运行 是否达到了算法的目的 例如绘制损失函数J(θ)可以帮助确认梯度下降算法是否收敛 Octave有非常简单的工具用来生成大量不同的图