美文网首页
R语言矩阵操作

R语言矩阵操作

作者: 育种数据分析之放飞自我 | 来源:发表于2019-07-16 07:41 被阅读0次

1.1 矩阵的生成

生成一个4行4列的矩阵,这里用1~16数字。

mat <- matrix(1:16,4,4)

mat

<table>
<tbody>
<tr><td>1 </td><td>5 </td><td> 9</td><td>13</td></tr>
<tr><td>2 </td><td>6 </td><td>10</td><td>14</td></tr>
<tr><td>3 </td><td>7 </td><td>11</td><td>15</td></tr>
<tr><td>4 </td><td>8 </td><td>12</td><td>16</td></tr>
</tbody>
</table>

1.2 提取主对角线

diag(mat)

<ol class=list-inline>
<li>1</li>
<li>6</li>
<li>11</li>
<li>16</li>
</ol>

1.3 生成对角线为1的对角矩阵

m1 <- diag(4)

m1

<table>
<tbody>
<tr><td>1</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td>0</td><td>1</td><td>0</td><td>0</td></tr>
<tr><td>0</td><td>0</td><td>1</td><td>0</td></tr>
<tr><td>0</td><td>0</td><td>0</td><td>1</td></tr>
</tbody>
</table>

1.4 提取矩阵的下三角

mat[lower.tri(mat)]

<ol class=list-inline>
<li>2</li>
<li>3</li>
<li>4</li>
<li>7</li>
<li>8</li>
<li>12</li>
</ol>

1.5 提取矩阵上三角

mat[upper.tri(mat)]

<ol class=list-inline>
<li>5</li>
<li>9</li>
<li>10</li>
<li>13</li>
<li>14</li>
<li>15</li>
</ol>

1.6 以矩阵下三角构建对角矩阵

mat1 <- mat

mat1[upper.tri(mat1)] <- t(mat1)[upper.tri(mat1)]


原矩阵mat:

mat

<table>
<tbody>
<tr><td>1 </td><td>5 </td><td> 9</td><td>13</td></tr>
<tr><td>2 </td><td>6 </td><td>10</td><td>14</td></tr>
<tr><td>3 </td><td>7 </td><td>11</td><td>15</td></tr>
<tr><td>4 </td><td>8 </td><td>12</td><td>16</td></tr>
</tbody>
</table>

变换后的对角矩阵

mat1

<table>
<tbody>
<tr><td>1 </td><td>2 </td><td> 3</td><td> 4</td></tr>
<tr><td>2 </td><td>6 </td><td> 7</td><td> 8</td></tr>
<tr><td>3 </td><td>7 </td><td>11</td><td>12</td></tr>
<tr><td>4 </td><td>8 </td><td>12</td><td>16</td></tr>
</tbody>
</table>

1.7 将矩阵转化为行列形式

原矩阵,生成三列:行,列,值

mat

<table>
<tbody>
<tr><td>1 </td><td>5 </td><td> 9</td><td>13</td></tr>
<tr><td>2 </td><td>6 </td><td>10</td><td>14</td></tr>
<tr><td>3 </td><td>7 </td><td>11</td><td>15</td></tr>
<tr><td>4 </td><td>8 </td><td>12</td><td>16</td></tr>
</tbody>
</table>

相关代码

nrow <- dim(mat)[1]

ncol <- dim(mat)[2]

row <- rep(1:nrow,ncol)

col <- rep(1:ncol, each=nrow)

frame <- data.frame(row,col,value =as.numeric(mat))

frame 

<table>
<thead><tr><th scope=col>row</th><th scope=col>col</th><th scope=col>value</th></tr></thead>
<tbody>
<tr><td>1 </td><td>1 </td><td> 1</td></tr>
<tr><td>2 </td><td>1 </td><td> 2</td></tr>
<tr><td>3 </td><td>1 </td><td> 3</td></tr>
<tr><td>4 </td><td>1 </td><td> 4</td></tr>
<tr><td>1 </td><td>2 </td><td> 5</td></tr>
<tr><td>2 </td><td>2 </td><td> 6</td></tr>
<tr><td>3 </td><td>2 </td><td> 7</td></tr>
<tr><td>4 </td><td>2 </td><td> 8</td></tr>
<tr><td>1 </td><td>3 </td><td> 9</td></tr>
<tr><td>2 </td><td>3 </td><td>10</td></tr>
<tr><td>3 </td><td>3 </td><td>11</td></tr>
<tr><td>4 </td><td>3 </td><td>12</td></tr>
<tr><td>1 </td><td>4 </td><td>13</td></tr>
<tr><td>2 </td><td>4 </td><td>14</td></tr>
<tr><td>3 </td><td>4 </td><td>15</td></tr>
<tr><td>4 </td><td>4 </td><td>16</td></tr>
</tbody>
</table>

1.8 将三列形式转化为矩阵

    nrow <- max(frame[, 1])

    ncol <- max(frame[, 2])

    y <- rep(0, nrow * ncol)

    y[(frame[, 2] - 1) * nrow + frame[, 1]] <- frame[, 3]

    y[(frame[, 1] - 1) * nrow + frame[, 2]] <- frame[, 3]

    matrix(y, nrow = nrow, ncol = ncol, byrow = T)

<table>
<tbody>
<tr><td>1 </td><td>5 </td><td> 9</td><td>13</td></tr>
<tr><td>2 </td><td>6 </td><td>10</td><td>14</td></tr>
<tr><td>3 </td><td>7 </td><td>11</td><td>15</td></tr>
<tr><td>4 </td><td>8 </td><td>12</td><td>16</td></tr>
</tbody>
</table>

1.9 将矩阵转置

t(mat)

<table>
<tbody>
<tr><td> 1</td><td> 2</td><td> 3</td><td> 4</td></tr>
<tr><td> 5</td><td> 6</td><td> 7</td><td> 8</td></tr>
<tr><td> 9</td><td>10</td><td>11</td><td>12</td></tr>
<tr><td>13</td><td>14</td><td>15</td><td>16</td></tr>
</tbody>
</table>

2.1 矩阵相加减

A=B=matrix(1:16,nrow=4,ncol=4)

A + B

<table>
<tbody>
<tr><td>2 </td><td>10</td><td>18</td><td>26</td></tr>
<tr><td>4 </td><td>12</td><td>20</td><td>28</td></tr>
<tr><td>6 </td><td>14</td><td>22</td><td>30</td></tr>
<tr><td>8 </td><td>16</td><td>24</td><td>32</td></tr>
</tbody>
</table>

A - B

<table>
<tbody>
<tr><td>0</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td>0</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td>0</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td>0</td><td>0</td><td>0</td><td>0</td></tr>
</tbody>
</table>

2.2 数与矩阵相乘

c <- 2

c*A

<table>
<tbody>
<tr><td>2 </td><td>10</td><td>18</td><td>26</td></tr>
<tr><td>4 </td><td>12</td><td>20</td><td>28</td></tr>
<tr><td>6 </td><td>14</td><td>22</td><td>30</td></tr>
<tr><td>8 </td><td>16</td><td>24</td><td>32</td></tr>
</tbody>
</table>

3.3 矩阵相乘

A 为m × n矩阵,B为n× k矩阵,用符合“%*%”

A <- matrix(1:12,3,4)

B <- matrix(1:20,4,5)

A%*%B

<table>
<tbody>
<tr><td>70 </td><td>158</td><td>246</td><td>334</td><td>422</td></tr>
<tr><td>80 </td><td>184</td><td>288</td><td>392</td><td>496</td></tr>
<tr><td>90 </td><td>210</td><td>330</td><td>450</td><td>570</td></tr>
</tbody>
</table>

3.4 计算t(A)%*%B的方法

第一种,直接计算

A <- matrix(1:12,3,4)

B <- matrix(1:15,3,5)

t(A)%*%B

<table>
<tbody>
<tr><td>14 </td><td> 32</td><td> 50</td><td> 68</td><td> 86</td></tr>
<tr><td>32 </td><td> 77</td><td>122</td><td>167</td><td>212</td></tr>
<tr><td>50 </td><td>122</td><td>194</td><td>266</td><td>338</td></tr>
<tr><td>68 </td><td>167</td><td>266</td><td>365</td><td>464</td></tr>
</tbody>
</table>

第二种方法,用crossprod函数,数据量大时效率更高

A <- matrix(1:12,3,4)

B <- matrix(1:15,3,5)

crossprod(A,B)

<table>
<tbody>
<tr><td>14 </td><td> 32</td><td> 50</td><td> 68</td><td> 86</td></tr>
<tr><td>32 </td><td> 77</td><td>122</td><td>167</td><td>212</td></tr>
<tr><td>50 </td><td>122</td><td>194</td><td>266</td><td>338</td></tr>
<tr><td>68 </td><td>167</td><td>266</td><td>365</td><td>464</td></tr>
</tbody>
</table>

3.5 矩阵求逆

a <- matrix(rnorm(16),4,4)

solve(a)

<table>
<tbody>
<tr><td>-3.542393 </td><td> 5.8825038</td><td>-3.2421870</td><td> 6.9619170</td></tr>
<tr><td> 1.081745 </td><td>-2.2446318</td><td> 1.4850549</td><td>-2.0828270</td></tr>
<tr><td>-1.577580 </td><td> 2.4698567</td><td>-0.7070850</td><td> 2.5241525</td></tr>
<tr><td>-0.830685 </td><td> 0.5105919</td><td>-0.3352182</td><td> 0.5344842</td></tr>
</tbody>
</table>

矩阵与其逆矩阵的乘积为对角矩阵

round(solve(a)%*%a)

<table>
<tbody>
<tr><td>1</td><td>0</td><td>0</td><td>0</td></tr>
<tr><td>0</td><td>1</td><td>0</td><td>0</td></tr>
<tr><td>0</td><td>0</td><td>1</td><td>0</td></tr>
<tr><td>0</td><td>0</td><td>0</td><td>1</td></tr>
</tbody>
</table>

3.6 矩阵的广义逆矩阵

对于奇异阵,并不存在逆矩阵,但是可以计算其广义逆矩阵

a <- matrix(1:16,4,4)

solve(a)
Error in solve.default(a): Lapack例行程序dgesv: 系统正好是奇异的: U[3,3] = 0
Traceback:


1. solve(a)

2. solve.default(a)

显示矩阵奇异,这里可以使用MASS包的ginv计算其广义逆矩阵

library(MASS)

a <- matrix(1:16,4,4)

ginv(a)

<table>
<tbody>
<tr><td>-0.285 </td><td>-0.1075</td><td> 0.07 </td><td> 0.2475</td></tr>
<tr><td>-0.145 </td><td>-0.0525</td><td> 0.04 </td><td> 0.1325</td></tr>
<tr><td>-0.005 </td><td> 0.0025</td><td> 0.01 </td><td> 0.0175</td></tr>
<tr><td> 0.135 </td><td> 0.0575</td><td>-0.02 </td><td>-0.0975</td></tr>
</tbody>
</table>

3.7 矩阵的直积(Kronecker,克罗内克积),使用函数kronecker计算

A 与B的直积:A \bigotimes B,LaTex写作 “A \bigotimes B”

假设A为2X2矩阵

A <- matrix(c(10,5,5,20),2,2)

A

<table>
<tbody>
<tr><td>10</td><td> 5</td></tr>
<tr><td> 5</td><td>20</td></tr>
</tbody>
</table>

假设B为3X3矩阵

B <- matrix(c(1,0,2,0,1,4,2,4,1),3,3)

B

<table>
<tbody>
<tr><td>1</td><td>0</td><td>2</td></tr>
<tr><td>0</td><td>1</td><td>4</td></tr>
<tr><td>2</td><td>4</td><td>1</td></tr>
</tbody>
</table>

则A和B的直积就是6X6的矩阵

kronecker(A,B)

<table>
<tbody>
<tr><td>10</td><td> 0</td><td>20</td><td> 5</td><td> 0</td><td>10</td></tr>
<tr><td> 0</td><td>10</td><td>40</td><td> 0</td><td> 5</td><td>20</td></tr>
<tr><td>20</td><td>40</td><td>10</td><td>10</td><td>20</td><td> 5</td></tr>
<tr><td> 5</td><td> 0</td><td>10</td><td>20</td><td> 0</td><td>40</td></tr>
<tr><td> 0</td><td> 5</td><td>20</td><td> 0</td><td>20</td><td>80</td></tr>
<tr><td>10</td><td>20</td><td> 5</td><td>40</td><td>80</td><td>20</td></tr>
</tbody>
</table>

3.8 矩阵的直和(direct sum)

公式:A\oplus B,在LaTex中是 "A \oplus B "

图片.png
A <- matrix(c(1,2,3,3,2,1),2,3)

A

<table>
<tbody>
<tr><td>1</td><td>3</td><td>2</td></tr>
<tr><td>2</td><td>3</td><td>1</td></tr>
</tbody>
</table>

B <- matrix(c(1,0,6,1),2,2)

B

<table>
<tbody>
<tr><td>1</td><td>6</td></tr>
<tr><td>0</td><td>1</td></tr>
</tbody>
</table>

r1 <- dim(A)[1];c1 <- dim(A)[2]

r2 <- dim(B)[1];c2 <- dim(B)[2]

direct_sum <- rbind(cbind(A,matrix(0,r2,c2)),cbind(matrix(0,r1,c1),B))

direct_sum

<table>
<tbody>
<tr><td>1</td><td>3</td><td>2</td><td>0</td><td>0</td></tr>
<tr><td>2</td><td>3</td><td>1</td><td>0</td><td>0</td></tr>
<tr><td>0</td><td>0</td><td>0</td><td>1</td><td>6</td></tr>
<tr><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td></tr>
</tbody>
</table>

相关文章

  • R语言矩阵操作

    1.1 矩阵的生成 生成一个4行4列的矩阵,这里用1~16数字。 1 5 9 13 2 6 ...

  • R语言 矩阵

    矩阵是其中元素以二维矩形布局布置的R对象。 它们包含相同原子类型的元素。 虽然我们可以创建一个只包含字符或只包含逻...

  • 加权基因共表达网络分析(WGCNA)实例

    获取表达数据矩阵 这里运行R语言包GDCRNATools的帮助文档中的例子获得胆管癌的rna表达矩阵 使用R语言包...

  • 《学习小组Day 4笔记--JnG》

    今天是进行R语言操作的日子 1.首先是下载R语言啦以及其操作平台Rstudio 2.简单的入手R语言操作命令R语言...

  • R语言的字符操作

    R语言主要擅长于数值向量和矩阵操作,但是让他去做字符串操作也可以吧。字符串的基本操作类型: 查找和替换 大小写转换...

  • 学习小组Day5笔记--LA

    R语言的操作 1.R语言的操作前提知识 1.R语言赋值,a <- 2.Console是输入命令的控制台 3.R语言...

  • R 学习矩阵操作

    欢迎关注天下博客:http://blog.genesino.com/2017/06/R-basic/Jump to...

  • PH525x series - 矩阵代数方程

    矩阵方程 无论是在数学上还是在R语言中,线性代数方程都可以起到简化描述与操作的作用,本篇的主要内容是对这种矩阵方程...

  • 《学习小组Day5笔记--寒鹤》

    R语言之数据结构 今天的学习内容是R语言的数据结构。R语言的数据结构主要有向量(vector),矩阵(matrix...

  • Day5—刘强

    R语言的数据结构 数据类型 R语言主要数据类型如下: 向量(vector) 矩阵(Matrix) 数组(Array...

网友评论

      本文标题:R语言矩阵操作

      本文链接:https://www.haomeiwen.com/subject/sixqgxtx.html