“ 矩阵是一种非常优秀的数学工具,他具有多种运算方式;而矩阵最大的特征就是矩阵的维度;对于任何一个矩阵,它都可以转化为向量。”
关于R语言全系列文章,都会放在这里,按照向量,矩阵,数据框,因子,编程结构以及函数,数据处理的过程
在有了对矩阵的初步学习的基础上,我们就可以来进行矩阵的进一步学习了,上文讲解了关于矩阵的创建,矩阵的索引以及矩阵的行列进行修改和删除,
在这一篇文章中,我们将要学习关于矩阵的更深一步的应用,即获取矩阵的维度,然后对矩阵进行运算,以及如何化简矩阵为向量。这三个操作都是日常使用中非常实用的操作,大家肯定会经常使用到的。矩阵的运算就包括了我们日常所使用的矩阵的点乘,叉乘,加减等等运算。而取维度更是很常用,因为获取维度以后我么就可以进行很多更高阶的运算了。而最后的矩阵转向量的操作更是关键,我曾经因为R没有打平操作而爆喷了一波R,后来发现只是我没找到怎么操作而已。。。。。
矩阵的维度获取
矩阵的维度获取其实非常的简单粗暴,正如同我们过去学的很多粗暴函数一样,它的获取是直接使用函数dim。
> m1 <- matrix(1:9,
+ nrow = 3,
+ ncol = 3)
> dim(m1)
[1] 3 3
是不是非常的简单粗暴呢?
再给大家整一个不是方阵的
> m2 <- matrix(1:10,
+ nrow = 2,
+ ncol = 5)
> dim(m2)
[1] 2 5
这里要记住,返回的值第一个是行,第二个是列,别记错了,后面使用的时候出问题。
这里还有一个问题,我们返回是dim值是一个向量,我们可以把它保存起来,方便后面多次使用
dm2 <-dim(m2)
dm2
我们的dm2是一个int类型的向量,使用的时候直接dm2[1]就可以取到行数,使用dm[2]就可以取到列数了。
矩阵转向量
介绍完了如何获取矩阵的行数和列数,我们来谈谈如何把矩阵转化为向量的操作。这个操作是因为曾经有一个问题急需矩阵打平转化为向量,我由于前面的工作都是R做的,没办法转向numpy去操作。于是我谷歌了一下R的flatten函数,结果发现它居然居然居然没有。
当时我那是一个气愤啊,索性用循环写了。你们可以想想,一个差不多五万乘五万的矩阵,给一行一行的打平,用的还是c(.. , ..)的方式,这在内存里得复制多少次啊。后来喝了一杯枸杞水才运行完。。。。
再后面,我找了很多资料也没找到,直到有一天看书,机缘巧合之下,我找到了下面的方法,直接打平矩阵到向量,不需要磨磨唧唧的循环
> c(m2)
[1] 1 2 3 4 5 6 7 8 9 10
带劲吗?就是这么简单,不需要任何花里胡哨的技巧,直接打平。
如果你说我不想按照列给它打平,我想按照行打平,那你是不是就得写循环了呢?其实也不用,我们都知道矩阵有个转置操作
> c(t(m2))
[1] 1 3 5 7 9 2 4 6 8 10
是不是非常简单呢,只需要c一下,矩阵就被打平了!!!
矩阵运算
最后,我们来讲解一下矩阵的运算。矩阵的运算方式多种多样,而我们日常中使用最多的,莫过于基本的数值运算,矩阵乘法以及矩阵的转置操作。
第一个先将矩阵的转置,非常简单,就是行列互换,或者 [x,y] -> [y,x]
使用函数 t()
# 转置
> m2
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> t(m2)
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[4,] 7 8
[5,] 9 10
方阵转置也是一样的,而且更容易看一些
> m1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> t(m1)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
第二个运算就是基本的数字运算,加减法
> m3 <- matrix(2:10,3)
> m3-m1
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 1 1
[3,] 1 1 1
> m3 + m1
[,1] [,2] [,3]
[1,] 3 9 15
[2,] 5 11 17
[3,] 7 13 19
注意,使用矩阵之间运算,你一定要使用维度相同的,不然R会为难的报错
> m2 + m3
Error in m2 + m3 : non-conformable arrays
还有一点,矩阵也具有循环补齐机制,大家理解为np的广播机制就可以了
> m3 + 1
[,1] [,2] [,3]
[1,] 3 6 9
[2,] 4 7 10
[3,] 5 8 11
> m3 + c(1,2,3)
[,1] [,2] [,3]
[1,] 3 6 9
[2,] 5 8 11
[3,] 7 10 13
如果你忘记了什么是循环补齐,请看
最后,就是矩阵乘法了,非常的简单,学过线代都懂,前面找行,后面找列
> m3 %*% m1
[,1] [,2] [,3]
[1,] 36 81 126
[2,] 42 96 150
[3,] 48 111 174
注意这里使用的符号是 %*% !!!
直接使用乘号则是普通的 x 乘
> m3 * m1
[,1] [,2] [,3]
[1,] 2 20 56
[2,] 6 30 72
[3,] 12 42 90
本文的内容就到这里结束了,这篇文章讲解了关于R语言矩阵的大部分运算内容,关于矩阵的维度,矩阵的线性代数运算以及如何把矩阵转化为向量的问题。其中,把矩阵转化为向量是个非常关键的内容,一定要万分注意!