在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
3.2 一般矩阵运算前面介绍了创建矩阵的基本方法,现在我们来看一些常用的矩阵运算,包括线性代数运算、矩阵索引和矩阵元素筛选。 关于矩阵线性代数运算的更多细节请参见8.4节。 这里我们提取了矩阵z中第2、3列的所有元素组成了一个子矩阵。 还可以对一个矩阵的子矩阵进行赋值: 这里给y的第1、3行赋了新的值。 向量的负值索引用来排除掉某些元素,这种操作同样适用于矩阵。 命令第二行的意思是,取出矩阵y中除第二行外的所有行。 读取文件mtrush1.pgm,并返回一个pixmap类的对象。再把这个对象在R里画出来,如图3-1所示。 我们来看一下pixmap类的组成内容: pixmap类属于S4类型,它用符号@来访问各个组件,而不是用符号$。S3和S4的问题将在第9章讨论,不过这里最关键的是灰度矩阵[email protected]。在这个例子里,这个矩阵有194行和259列。 为了演示矩阵操作,我们将罗斯福总统的脸覆盖上(对不起了,总统先生,我对你没有个人恩怨)。使用R中locator()函数来找到需要盖住部分的行号和列号。当调用这个函数时,R会等待用户点击图片上的任意点,然后返回该点的准确坐标。用这种方式可以找到罗斯福总统的脸对应区域是从84行到163行,从135列到177列。(注意,pixmap对象的行编号和locator()是相反的:pixmap是自上而下递增的,而locator()恰恰相反。)于是,为了把这部分图像覆盖上,我们把这一区域的所有像素点取值设为1.0。 效果如图3-2所示。 如果只是想将罗斯福总统的脸模糊掉,而不是去掉,可以在图片上增加随机噪声。代码如下: 如注释所显示的,我们生成随机噪声,然后把目标像素点矩阵和噪声进行加权平均。参数q控制噪声的权重,q值越大就越模糊。随机噪声取自U(0,1),即区间(0,1)上的均匀分布。注意,下面是矩阵操作: 效果如图3-3所示。 3.2.4 矩阵元素筛选 下面来分析一下这条命令,正如我们在第2章所讲那样: 为了提高性能,需要注意的是,计算j时使用的是完全向量化运算。这是因为: 表达式 z 2 ==1用于判断z的每个元素是否是奇数,返回的结果是(TRUE, FALSE, TRUE)。因此我们提取出了x的第一、三行。 这里也是同样的做法,但是使用了稍微复杂的条件来提取矩阵的行。(用类似的方式可以提取列或子矩阵。)首先表达式m[,1] > 1把m的第一列的每个元素同1进行比较,返回(FALSE,TRUE,TRUE)。类似的是,第二个表达式m[,2] > 5返回(FALSE,FALSE,TRUE)。对(FALSE,TRUE,TRUE)和(FALSE,TRUE,TRUE)进行逻辑“与”运算,得到(FALSE,FALSE,TRUE)。以运算后的向量为行索引,得到矩阵m的第三行。 这行命令说明,从向量索引的角度来看,m的第1、3、5、6个元素大于2。第5个元素指的是m第2行第2列的元素,即10,的确比2大。 下面就是生成这种矩阵的代码: 下面来解释它的运算过程。首先col()返回的是矩阵元素的列号,和row()功能相似。然后第三行的row(m)返回一个由整数组成的矩阵,每个整数代表矩阵m中对应元素的行号。例如: 因此表达式row(m) == col(m)返回一个由FALSE和TRUE组成的矩阵,矩阵的对角线位置是TRUE,其他位置是FALSE。再次提醒一下读者,本例中的二目运算符"=="是一个函数,row()和col()也是函数。因此,下面这个表达式: 会作用到矩阵m的每一个元素上,最后返回一个由FALSE和TRUE组成的矩阵,其行数和列数与m的相同。表达式ifelse()同样是一个函数调用。 在本例中,刚才提到的由TRUE和FALSE组成的矩阵传递给ifelse()函数做参数,返回一个矩阵,对角线元素为1,其他位置为0。 |
请发表评论