n阶魔幻矩阵用Java_【蒟蒻机器学习】Octave中的进阶矩阵操作

【蒟蒻机器学习】Octave中的进阶矩阵操作

jvruo • 2020 年 01 月 30 日

在之前的BLOG中,我们已经初步掌握了矩阵的定义和一些简单的运算,这篇BLOG,就让我们继续看看矩阵中的一些进阶操作吧!

矩阵算术运算

矩阵的算术运算

首先是对于两个矩阵 A 和 C,如果想要得到这两个元素的积,前面提到过,只要A * C就好了:

ba172e94f6b289ad8cb799a8e625e93c.png

同理对于除法加法减法也是一样的,这里就不赘述了。

矩阵元素的算术运算

而对于两个大小相同的矩阵 A 和 B,如果我想要对应位置的元素相乘,就要使用到A .* B:

dde26ff18a013cab7f3e5e7b9e1e9051.png

同样地,如果想要 A 中的每个元素乘以 c ,我们就可以用A .* c,如果想要 A 中的每个元素除于 d ,我们也可以用A ./ d,如果想要 A 中的每个元素都变成自身的 e 次幂,我们也可以用A .^ e来实现:

b16e7725e6673da2da11c7fed5432d82.png

对于矩阵或者向量 A ,我们还可以使用1 ./ A来让 A 中的所有元素变成自己的倒数:

d78c896cdcffdef5845603787977b753.png

类似的数学运算还有让 v 中所有元素对 e 取对数-log(v),所有元素 vi 变成 e^vi-exp(e):

091d719bc603165616f14a3a61d8b714.png

还有对 v 中所有元素取绝对值的函数-abs(v),让 v 中所有元素变成自身的相反数的函数--v:

7669b4e38fd3503aeca956316a654335.png

如果你想给你的向量 v 的每一个元素加上一个常数 c ,我们有两种方法,一种是v + c * ones(length(v), 1),另一种是直接v + c:

04cc3d0edcd0a4a5478514e21e53e803.png

矩阵函数使用

接下来我们来看看一些常用的矩阵操作函数。

矩阵的转置和逆元

首先肯定是转置了,对于一个矩阵 A ,其转置就是A',记住转置的转置就是矩阵本身:

583dc923acce35b932a8b31a05c9dfa6.png

而pinv(A)可以求出 A 的逆(无逆时求出伪逆):

559140c6267f35f1fd0b85cfbb609f27.png

最值的计算

接下来我们来看看大名鼎鼎的max()函数。

首先对于一个行向量 a, max(a)可以直接得到 a 中的最大值,而[val, ind] = max(a)则不仅可以获得 a 中的最大值,还可以知道最大值出现在第几个元素:

951a14122ff35edf196b40b4f94c0d42.png

而如果对于一个矩阵 B, max(B)就与max(B, [], 1)一样,返回的是一个行向量,记录的是每一列的最大值;而max(B, [], 2)返回的则是一个列向量,记录的是每一行的最大值:

d548cf01f4ba43f092c7777621a056f8.png

所以如果要统计一个矩阵 B 的最大值,我们通常有两种办法,一种是直接max(max(B)),另一种是通过之前提到过的将所有元素变成一个列向量的max(B(:))的方式:

9535ecfbe5f45a32b8cf7026827b1344.png

我们还可以对于两个大小相同的矩阵 A 和 B,max(A, B)输出的是每个对应位置上 A 和 B 中元素的最大值:

0eee486f2a367e6837b8eb6c0f26db3b.png

元素的寻找

首先,对于一个行向量 a ,如果我想知道每个元素是否小于 3 ,我可以直接使用a < 3,返回的也是一个向量,反应的是对应 a 位置是否小于 3 ,是则为 1 ,不是则为 0 :

e8faafbac8e063dc0c14c604fcfbbb56.png

我也可以运用上面的结果,结合find(条件)函数找到满足条件的元素的位置,比如find(a < 3)可以找到所有小于 3 的元素的下标:

05a83d1a57eab0b88abcf86a6bf146f0.png

而对于矩阵 A 而言,find(条件)同样适用,比如[r, c] = find(A >= 7)可以找到 A 中所有大于等于 7 的元素的坐标:

969f0e09bb02fd321a3b67fc10e17276.png

在上面这个例子中,坐标为(1,1)(3,2)(2,3)的元素均满足大于等于 7 的条件。

累乘和累加

对于一个行向量 a, 我们可以通过sum(a)来得到 a 中所有元素的累加和,通过prod(a)类得到 a 中所有元素的累乘:

8c5e9f2f116376669ef8098965423505.png

而对于一个矩阵 A,我们可以通过sum(A, 1)来得到每一列的累加和,sum(A, 2)来得到每一行的累加和,prod也是同理的:

8615a018e55dcc08fec64e88f7b73df4.png

向下取整和向上取整

对于一个矩阵或者向量 a ,我们可以通过floor(a)来让所有元素向下取整,也可以通过ceil(a)来让所有元素向上取整:

7901ec872fbbf76bcfa942155e244924.png

奇幻矩阵

下面我们要见到的,是一种叫做奇幻矩阵的特殊方阵,对于 n 阶的奇幻矩阵,其每个元素都不重复且均在 1 - n^2 中,并且每一行每一列和两条对角线上的元素的和都是相同的,在Octave中,我们可以使用magic(n)来生成一个n阶的奇幻矩阵:

9872940f649db73ceb94c15a5b98a87b.png

镜像翻转

我们如果想要只保留一个 n 维方阵 A 的主对角线上的元素,我们只要A .* eye(n)就可以了:

那如果我要反对角线上的元素呢?很容易想到,只要 A 乘以一个单位矩阵沿着竖直的中轴线翻转的矩阵就可以了。那如何实现这样镜像翻转呢?其实对于矩阵 B ,flipud(B)得到的就是 B 沿着竖直的中轴线翻转所得到的矩阵,所以操作也就很简单了:

be8677e1b60e28381d19d56ea300a2da.png

结语

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值