当前课程知识点:R语言数据分析 > 中部:执具 > 第7章 数据对象——面向数据对象学习R语言 > 7.4 矩阵与数组(II)
大家好
欢迎来到《R语言数据分析》课程
今天继续和大家一块交流
矩阵与数组的相关内容
说到矩阵的时候
其实我们在以前学线性代数的时候
经常碰到解方程组的问题
比如说这么一个简单的方程组
我们要解的话 以前一般都通过消元法
我来解这个方程组
一旦有了R之后 有这个工具之后
其实我只要调用这个
solve()这么一个函数就可以
solve(A, b)
它接收两个参数
第一个A代表这个系数矩阵
而b毫无疑问就是个常数项
咱们针对这个线性方程组
我们看一看R里面怎么解它
我们看一看R里面怎么解它
毫无疑问首先我应该
我先要把这个系数矩阵给创建了
还是同样这个系数矩阵
毫无疑问是一个3乘3的长度为9的一个矩阵
包含3行3列包含这么9个元素
我们对照这个线性方程组
我们写一下这个系数矩阵
1 2 3
2 2 5
3 5 1
一般来讲我们在创建矩阵的时候
推荐大家按照它固有的形式来排列它
虽然它是一个9
本质上是一个长度为9的一个数值向量
但我们最好是按照这个矩阵的方式
来编排来排版
排版我们的代码
毫无疑问这个时候因为我是按照
1-2-3 2-2-5 3-5-1
这个方式来填充的
这个时候我byrow应该设为TRUE
就按行进行填充
得到一个矩阵就是
1-2-3
2-2-5
3-5-1
好 常数项毫无疑问
这个是比较创建就比较简单了
就是1到3
1:3 = 1 2 3
然后要解这个线性方程组的话
将这个创建A和这b放到
solve()这个函数里面来作为参数
传递给它就可以了
很容易我们得到它相应的这个解
1 0 0
x1等于1
x2和x3都为0
我们讲了solve()这个函数的话
前面是A是这个系数
这个b的话 第2个参数是
是我们右侧这一部分
假如把这个b改成E的话
改成单位矩阵的话
毫无疑问AX等于E的话这个X等于多少
这个时候其实等于A’
A’就是A的一个逆矩阵
也就是说通过这个solve()函数其实可以求
一个矩阵的逆
咱们看一看R里面怎么实现
毫无疑问
这个时候我们可以先创建一个单位矩阵
通过这个diagonal
当然diag()这是用来生成一个对角矩阵的
比如说我这里面给它一个向量的话
比如说diag(1:3)
1到3的话就比较
生成了1 2 3
这个对角线上为1 2 3的一个对角矩阵
假如我只交给它一个参数3的话
那就都是什么 1 1 1
3乘3一个单位矩阵就创建好了
这个时候我再将这个A和这个单位矩阵
作为参数传递给solve()这个函数的话
毫无疑问
结果就是A的一个逆矩阵了
这么一种方式
其实就实现了我们所谓的矩阵求逆的过程
也是通过solve()这个函数
那毫无疑问我们将这个逆矩阵
当然我们假如这个solve()只接受一个参数的话
我默认这个b就是就是单位矩阵
所以这个结果其实就是A的一个逆矩阵了
假如矩阵相乘的话
这个时候要通过两个百分号
将这个乘号括起来
就表示A的逆矩阵乘以A
是什么呢
逆矩阵和它自己相乘是单位矩阵
应该就是
我们得结果应该对角相等都为1
但是我们现在看到结果不是这样的
发现对角线上差不多都为1
有比如说比1大一点点的比1小一点点的
然后非对角线上的元素差不多为0
但不确切为0
这是为什么
难道R连这么一个简单的问题解决不了吗
其实这并不是R本身的问题
它是一个数据存储的问题
我们再看下面这个例子
比如说sqrt这表示开根号
前面是sq=square rt=root
就是表示开根号
这个前面是根号2
根号2再平方
应该就是2是不是
但是你发现sqrt(2)
然后根号2再平方的话
你发现它和2是相等的吗
不是
它返回结果是FALSE
为什么呢
这其实和前面这个我们看到的
它的逆矩阵和本身相乘不为单位矩阵
它道理是一样的
什么意思
比如说我对根号2这么一个无理数
其实你全世界所有电脑拿过来你都存不下它
假如把它所有位都存下来的话
无理数是无穷无尽的
但我们计算机里面存储它是有限的
存储的位数是有限的
所以它只是近似的
前面这一部分只是近似的表示根号2
它并不是确切的数学意义上的根号2
它在平方之后它就不是2
平方之后就不是2了
同样我这个逆矩阵在求的过程中
它其实本身也是存储有限位
也是一个近似的表达
所以这个时候我们一般怎么办
我们可以通过比如说dplyr
这个包里面有一个near()这个函数
就差不多就可以了
就比如说sqrt 根号2再平方
和2是不是差不多
就非常近似
是不是这样的
这个时候我们结果就是TRUE了
同样我们针对这个我们逆矩阵和单位矩阵
它相乘之后和单位矩阵相比
和diag(3)相比
每一个元素是不是都相同
你发现它返回结果也是相近的
这个near()它结果就是
这个时候我们可以做一个判断
就不要直接和它相等
也是通过这个near()函数来判断
这里面我们讲了一下
通过R来解一个简单的线性方程组
同时通过solve()函数简单讲一下我们
R里面如何求这个矩阵的逆矩阵
其实在R里面
不管是矩阵相乘也好
转置
求它的行列式
求逆
包括比如说我们求矩阵的特征值
求它的
比如说
对矩阵进行分解
其实都有实现
强烈建议大家看一下这个
它是R和Matlab进行一个对照的
就是Matlab里面是哪些函数
R里面是哪些函数
几乎将我们这里面能碰到的
关于矩阵的一些操作都进行了实现
咱们时间有限
我们在课堂上就不详细展开了
以上就我们关于这个矩阵的最基本的内容
还是回到我们这个数据对象地图
在讲完了第二组里面第一个矩阵之外
接下来我们就开始进入第二组里面
下一个内容就是数组
其实矩阵和数组为什么把它们放在一组
因为矩阵它本质上就是数组
它是一个二维的数组
然后数组的话可以是高维的
可以是三维四维甚至更高维
但一般来讲
我们通常能用得到的三维数组居多
当然我们脑子里能想象到的
其实也顶多有三维的数据空间
再高维其实基本上也
超出我们的想象的范围了
绝大部分这情况之下也是以三维数组居多
比如说我们一个彩色图像
它其实就本质上存储就是
一个三维数组的方式来存储
我们接下来就以这么一个总统山的
这么一个图像为例
它是怎么处理的
它是怎么一种数组的方式进行处理
我们来以这个为例
我们简单讲述一下这个三维数组的操作
我们这个图像是482×345这么一个图像
这个图像我们可以
已经托管在这个github里面
咱们可以通过这个url
我们将它download直接将它下载到本地
下载到本地之后
我通过调用这个library(imager)一个函数
我可以将这个图片先加载到我们的R里面来
作为这个presidents
交给这个变量
好 我们看一下
通过这个str来看看这个数据结构是什么样
一看到这个482和345
我们就比较兴奋了
其实它就是一个数组
和我们前面看到的这个图像是完全一致的
就是482长
就是它的长和宽分别是482 345
究竟是个什么原理
咱们后面再看还有一个1
3对不对
123
因为它是一个RGB
它是一个彩色图像
它真正的内部工作原理是这样的
我们作为一个彩色图像的话
毫无疑问它是图层有三个图层
有R 有G 有B
同样在R里面要存储的话
它其实存储为一个三维数组
大家注意了比如说这个X轴
Y轴 Z轴
我们的X轴
是多少1到482
Y轴1到345
Z轴大家看看1 2 3
它其实我们可以理解为
就是三个二维数组
分别代表三个图层
所以接下来我们在做这个图像处理的时候
其实我们就可以把它当做一个数组来进行处理
比如说我现在一旦读到这个R里面来了
这个load.image()把这个图片
我们硬盘上存储的jpg文件
读到这个R里面来了
我们可以plot一下
大家看一下
这毫无疑问1到482
1到345
假如我现在只想看这个红色图层
我可以把它的第二个第三个图层怎么样
都赋为0
这时我再plot以一下的时候
你发现它变成红色的
假如我把第一个和第三个图层去
赋值为0的话
这个时候变成
只留下这个绿色的部分
同样假如把前两个去掉的话
就只留下这个蓝色的部分了
blue这部分
当然我们也知道
这个假如调色的话
我只保留前面两个图层
第三个图层不要的话
这时候就变成黄色
我要是把第三个图层去掉
赋值为0
这时候再plot的时候你发现什么
这个照片已经泛黄了
所以我们看得出来
其实所谓的图片的操作
其实本质上都是
我们数组的操作
当然前面都是相对比较简单一些操作
就是一个颜色一个变换
我们再看一个相对复杂一点点的
比如说我们这个总统山里面这个照片里面
我们要在林肯总统的头像上面
加一个类似于马赛克的这么一个效果
怎么加
其实我们在上面叠加噪声就可以
我首先找到这个位置
找这个区域
350到449
就是x
然后y
110到259
就是一个分别为100和150的这么一个区域
这个时候它其实三个
因为它是一个RGB的图像
所以它应该有三个图层
RGB都是这么一个方式
这个区域它的维度分别多少
100
150
3
就是i j k分别为100 150 3
这个时候我就可以
100乘以150乘以3
生成这么长的一些噪声
我就通过这个均匀分布来产生它
当然这个prod() product这是表示乘
就是i*j*k 分别相乘
好 生成这么一个噪声数据之后
我来创建通过array这个函数来创建一个数组
所以它无论是数组也好矩阵也好
创建的过程都是赋值
通过相应的函数
比如说通过c() 通过factor() 通过matrix()
通过我们这边array()
来创建这么一个小区域的一个数组
它的维度我们刚才看了
分别是100 150 3
然后它的数据是什么呢
刚才我们生成的这个均匀分布的一个数据
将它交给array()这个函数
就产生了相应这个区域的一个数组了
要实现这个打马赛克
类似马赛克的效果怎么办
我只要将这一部分
随机的噪声和谁相加
和原始图像这部分区域相加
也是这个区域相加
相加完之后
再交给原始这个presidents
这么一个数组 这么一个对象
当然这里面我们加了一个系数
分别是乘以0.6和0.4
它们只要加起来为1就可以
好 我们再看看这个加完之后效果是为
我一plot
你发现plot之后
就是我们加了一个类似于马赛克的一个效果
当然我们前面讲了这些
无论是变颜色也好
还是加一个小的这个马赛克的效果
其实相对都是比较简单的一个图像操作
但是我们其实有一个最基本的理念
无论我这个数据在硬盘上面
我在从其它渠道拿到的数据是什么样的
是图像的是音频的还有其它一些数据
最终到我们R里面来都是
我们六种数据对象之一
向量 因子
矩阵 数组
列表 数据框
列表 数据框
这是我们关于这个数据对象
尤其是关于这个矩阵和数组
我们最基本内容一个简单的介绍
本次课到此结束
谢谢大家
-第1章 气象万千、数以等观
--第1章 作业
-第2章 所谓学习、归类而已
--第2章 作业
-第3章 格言联璧话学习
--第3章 作业
-第4章 源于数学、归于工程
--第4章 作业
-讨论题
-第5章 工欲善其事、必先利其器
--第5章 作业
-第6章 基础编程——用别人的包和函数讲述自己的故事
--6.1 编程环境
--6.4 控制流
--第6章 作业
-第7章 数据对象——面向数据对象学习R语言
--第7章 作业
-第8章 人人都爱tidyverse
--第8章 作业
-第9章 最美不过数据框
--第9章 作业
-第10章 观数以形
--第10章 作业
-第11章 相随相伴、谓之关联
--11.1 导引
--第11章 作业
-第12章 既是世间法、自当有分别
--12.1 导引
--第12章 作业
-第13章 方以类聚、物以群分
--13.1 导引
--第13章 作业
-第14章 庐山烟雨浙江潮
--第14章 作业