R入门Day4:数据类型3---矩阵

20200510·Kony·Win10

矩阵

矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix()创建矩阵。一般使用格式为

mymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns, 
                    byrow=logical_value, dimnames=list(
                      char_vector_rownames, char_vector_colnames))

参数说明

vector包含了矩阵的元素;
nrow和ncol用以指定行和列的维数;
dimnames包含了可选的、以字符型向量表示的行名和列名。
选项 byrow 则表明矩阵应当按行填充( byrow=TRUE )还是按列填充( byrow=FALSE ),默认情况下按列填充

1. 创建矩阵

matrix()

a<-matrix(c(1,2,3,4,5,6),nrow=2,byrow=T)
a
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6

dim()
通过dim来创建,先生成向量x,接着给向量x适当的维数,此例子中给向量的维数为5行,3列:

x <- 1:15
x # 建立x
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15

dim(x) #查看x的维度

##  NULL

dim(x) <- c(5,3)   # 将向量x转化为5行3列的矩阵
x
##       [,1] [,2] [,3]
##  [1,]    1    6   11
##  [2,]    2    7   12
##  [3,]    3    8   13
##  [4,]    4    9   14
##  [5,]    5   10   15

2. 矩阵命名

Dimnames(Row_name,Col_name),给定行和列的名称,如果不需要给行或者列命名,则以NULL代替。

a<-c(1,2,3,4,5,6);
a
## [1] 1 2 3 4 5 6

a<-matrix(a,nrow=2,byrow=T,dimnames=list(c('a','b'),c('A','B','C')));
a
##   A B C
## a 1 2 3
## b 4 5 6

rownamescolnames实现

b
## [1] 2 3 4 5 6 7

b<-matrix(b,nrow=2)  # 将向量b转化为矩阵
b
##      [,1] [,2] [,3]
## [1,]    2    4    6
## [2,]    3    5    7

rownames(b)<-c("row_1","row_2") # 将矩阵行命名
colnames(b)<-c("col_1","col_2","col_3") # 将矩阵的列命名
b
     col_1 col_2 col_3
row_1     2     4     6
row_2     3     5     7

3. 参看矩阵

3.1 查看矩阵行/列相关信息

colnames(a) # 查看矩阵列名
## [1] "A" "B" "C"

rownames(a) # 查看矩阵行名
## [1] "a" "b"

3.2 查看矩阵的维度

dim(a) # 返回行与列数
## [1] 2 3

nrow(a) # 返回行数
## [1] 2

ncol(a) # 返回列数
## [1] 3

3.3 条件提取子集矩阵

a # 查看矩阵a
##   A B C
## a 1 2 3
## b 4 5 6

a[2,3] #取矩阵a的第行,第3个元素
## [1] 6

a[,1] #取矩阵a的第1列
## a b 
## 1 4

a[1,] # 取矩阵a的第1行
## A B C 
## 1 2 3

x<-c(1,2,3,4,5,6,7,8,8)
x<-matrix(x,nrow=3)
x

##      [,1] [,2] [,3]
## [1,]1    4    7
## [2,]2    5    8
## [3,]3    6    8

x[,3] # 选取矩阵的第3列
## [1] 7 8 8

x[3,] # 选取矩阵的第3行
## [1] 3 6 8

y<-x[,3,drop=FALSE] # 选取x矩阵的第3列,并返回一个矩阵给y
y

##      [,1]
## [1,]    7
## [2,]    8
## [3,]    8

x[,-1] # 不显示矩阵的第1列

##      [,1] [,2]

## [1,]4    7

## [2,]5    8

## [3,]6    8

x[-1,] # 不显示矩阵的第1行
##      [,1] [,2] [,3]
## [1,]2    5    8
## [2,]3    6    8

x[,-(1:2)] # 不显示矩阵的第1,2列
## [1] 7 8 8

z<-x[,-(1:2),drop=FALSE] #不显示矩阵x的第1,2列,并且返回为一矩阵y
z
##      [,1]
## [1,]    7
## [2,]    8
## [3,]    8

3.4 提取矩阵的行或列

nrowncol函数: nrow与ncol函数返回行或列的某一个数字。
NCOL****与NROW用于向量,即把向量作为单行的矩阵处理。
用法: nrow(x) ncol(x) NCOL(x) NROW(x)
参数: x:向量,或数据框; 值:长度为1或无的整数; 类似的有dim函数

ma <- matrix(1:12, 3, 4);ma # 建矩阵3行4列的矩阵

##      [,1] [,2] [,3] [,4]
## [1,]1    4    710
## [2,]2    5    811
## [3,]3    6    912

nrow(ma)   # 行数为3
## [1] 3

ncol(ma)   # 列数为4
## [1] 4

y <-array(1:24, dim = 2:4);y # 建2行4列的数组
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]1    3    5
## [2,]2    4    6
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]7    9   11
## [2,]8   10   12
## 
## , , 3
## 
##      [,1] [,2] [,3]
## [1,]13   15   17
## [2,]14   16   18
## 
## , , 4
## 
##     [,1] [,2] [,3]
## [1,]19   21   23
## [2,]20   22   24

ncol(y)
## [1] 3

NCOL(1:12) # NCOL把数组作为单行的矩阵处理
## [1] 1

NROW(1:12) # 12
## [1] 12

4. 矩阵的运算

4.1 矩阵相乘 %*%

只有当矩阵a的列数与矩阵b的行数相等时a×b才有意义。
一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会得到一个m×p的矩阵c(m,p),满足矩阵乘法满足结合律,但不满足交换律。
运算的法则:
矩阵a的第1行的3个元素(1,2,3)分别与矩阵b第1列的3个元素(1,2,3)相乘,其和为结果为e[1,1],即e[1,1]=1×1+2×2+3×3=14;
矩阵a的第1行的3个元素(1,2,3)分别与矩阵b第2列的3个元素(4,5,6)相乘1×4+2×5+3×6=32,得到e[1,2];
矩阵a的第2行的3个元素(4,5,6)分别与矩阵b第1列的3个元素(1,2,3)相乘4×1+5×2+6×3=32,得到e[2,1];
矩阵a的第2行的3个元素(4,5,6)分别与矩阵b第2列的3个元素(4,5,6)相乘4×4+5×5+6×6=77,得到e[2,2].

a
##   A B C
## a 1 2 3
## b 4 5 6

d <- c(1:6)
d <- matrix(d,nrow=3)
d

##      [,1] [,2]
## [1,]1    4
## [2,]2    5
## [3,]3    6

e<-a%*%d
e
##   [,1] [,2]
## a   14   32
## b   32   77

4.2 矩阵合并

m1<-matrix(1,nrow=2,ncol=2)

m1 # 建立矩阵m1,2行2列,值为1

##      [,1] [,2]
## [1,]1    1
## [2,]1    1

m2<-matrix(2,nrow=2,ncol=2)

m2 # 建立矩阵m2,2行2列,值为2

##      [,1] [,2]
## [1,]2    2
## [2,]2    2

m_rbind<-rbind(m1,m2);m_rbind # 对两个矩阵m1,m2进行行合并,即上下合并

##      [,1] [,2]
## [1,]1    1
## [2,]1    1
## [3,]2    2
## [4,]2    2

m_cbind<-cbind(m1,m2);m_cbind #对两个矩阵m1,m2进行列合并,即左右合并

##      [,1] [,2] [,3] [,4]
## [1,]1    1    22
## [2,]1    1    22

4.3 星号

把两个矩阵中每个对应的元素相乘,例子中a与b拥有相同的维度

a

##   A B C
## a 1 2 3
## b 4 5 6

b

##       col_1 col_2 col_3
## row_12     4     6
## row_23     5     7

result<-a*b #将矩阵a与矩阵b相乘,并将其结果给result
result

##    A  B  C
## a  2  8 18
## b 12 25 42

4.4 增加行与列

f<-matrix(,4,2) # 建立4行2列的空矩阵f
f

##      [,1] [,2]
## [1,]NA   NA
## [2,]NA   NA
## [3,]NA   NA
## [4,]NA   NA

f[c(1,3),]<-matrix(c(1,2,3,4)) #取f的1行与3行,将向量(1,2,3,4)填充进去,默认按列填充
f
##      [,1] [,2]
## [1,]1    3
## [2,]NA   NA
## [3,]2    4
## [4,]NA   NA

g<-matrix(,4,2)
g
##      [,1] [,2]
## [1,]NA   NA
## [2,]NA   NA
## [3,]NA   NA
## [4,]NA   NA

g[c(1,3),]<-matrix(c(1,2,3,4),byrow=FALSE) # byrow=FALSE则按行填充
g
##      [,1] [,2]
## [1,]1    3
## [2,]NA   NA
## [3,]2    4
## [4,]NA   NA

4.5 矩阵转置

f
##      [,1] [,2]
## [1,]1    3
## [2,]NA   NA
## [3,]2    4
## [4,]NA   NA

h<-t(f)
h
##      [,1] [,2] [,3] [,4]
## [1,]1   NA    2NA
## [2,]3   NA    4NA

4.6 取对角元素

j<-c(1,2,3,4,5,6,7,8,9)
j # 建立向量j
## [1] 1 2 3 4 5 6 7 8 9

j<-matrix(j,nrow=3)
j #建立3行3列矩阵
##      [,1] [,2] [,3]
## [1,]1    4    7
## [2,]2    5    8
## [3,]3    6    9

j_diag<-diag(j) #取对角
j_diag
## [1] 1 5 9

diag()函数其他用法

a <- c(1,4)
diag(a)
#       [,1] [,2]
#  [1,]   1   0
#  [2,]   0   4

4.7 求各行与列的总和与均值

j
##      [,1] [,2] [,3]
## [1,]1    4    7
## [2,]2    5    8
## [3,]3    6    9

rowSums(j) # 求各行的总和
## [1] 12 15 18

rowMeans(j) # 求行的均值
## [1] 4 5 6

colSums(j) #求各列的总和
## [1]  6 15 24

colMeans(j) #求各列的均值
## [1] 2 5 8

4.8 矩阵的特征值与特征向量

矩阵A的谱分解为A=UΛU,其中Λ是由A的特征值组成的对角矩阵,U的列为A的特征值对应的特征向量,在R中可以使用eigen()得到U和A,eigen(x,symmertic, only.values=FALSE,EISPACK=FALSE)
其中参数symmetric项是逻辑值,是F或T,它用于指定矩阵x是否为对称矩阵,如果不指定,系统将自动检验x是否为对称矩阵

eigen(j)
# ?eigen() decomposition
#  $values
#  [1]  1.611684e+01 -1.116844e+00 -5.700691e-16

#  $vectors
#             [,1]       [,2]       [,3]
#  [1,] -0.4645473 -0.8829060  0.4082483
#  [2,] -0.5707955 -0.2395204 -0.8164966
#  [3,] -0.6770438  0.4038651  0.4082483

4.9 矩阵的求逆

a<-matrix(1:8,2,4)
b<-matrix(2:9,4,2)
e<-a%*%b  ## a的行数与b的列数相同
a
##       [,1] [,2] [,3] [,4]
##  [1,]    1    3    5    7
##  [2,]    2    4    6    8

b
##       [,1] [,2]
##  [1,]    2    6
##  [2,]    3    7
##  [3,]    4    8
##  [4,]    5    9

e
##       [,1] [,2]
##  [1,]   66  130
##  [2,]   80  160

solve(e)
##       [,1]    [,2]
##  [1,]  1.0 -0.8125
##  [2,] -0.5  0.4125

参考:RVDSD的个人笔记

### 矩阵的choleskey分解

### 矩阵奇异值分解


### 矩阵QR分解

### 矩阵kronecker积

笔记参考:R语言基础--数据类型之矩阵

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343