R语言系列9 | 变量类型8-矩阵运算 矩阵维度以及矩阵转向量

“ 矩阵是一种非常优秀的数学工具,他具有多种运算方式;而矩阵最大的特征就是矩阵的维度;对于任何一个矩阵,它都可以转化为向量。”

关于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语言矩阵的大部分运算内容,关于矩阵的维度,矩阵的线性代数运算以及如何把矩阵转化为向量的问题。其中,把矩阵转化为向量是个非常关键的内容,一定要万分注意!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容