1. 程式人生 > >◮ R語言筆記(四): 向量、陣列、矩陣與資料框 + 利用矩陣求解二維線性方程組

◮ R語言筆記(四): 向量、陣列、矩陣與資料框 + 利用矩陣求解二維線性方程組

在筆記一中已經提到了向量,這篇文章主要介紹R語言中的四中常用的結構:

向量:*傳送門*

陣列

矩陣

資料框

然後在介紹如何利用矩陣求解二維線性方程組。

 

****************************************************************************************************************************************

 

 

一:陣列(*陣列可以理解是一個向量按照給定的維度進行拆分

陣列即是二維向量,矩陣是一種特殊的二維陣列


將一個向量轉化為一個二位陣列(新增指定維度即可)

> x = c(1,2,3,4,5,6);dim(x)<-c(2,3)  #兩行三列

> x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

 

 

二:矩陣(矩陣matrix)

將兩個向量合成矩陣(按照行合併rbind()+按照列c合併cbind())

> x1 = c(1,2,3,4,5)
> x2 = c(6,7,8,9,0)

> rbind(x1,x2)    #行式合併
   [,1] [,2] [,3] [,4] [,5]
x1    1    2    3    4    5
x2    6    7    8    9    0

> cbind(x1,x2)    #column列式合併
     x1 x2
[1,]  1  6
[2,]  2  7
[3,]  3  8
[4,]  4  9
[5,]  5  0

將一個向量生成矩陣(matrix(x,nrow=?,ncol=?,byrow=T/F))

> a = c(1:12)

> matrix(a,ncol=3,nrow=4,byrow=F)    #column列 row行
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12


# 預設是按照列來儲存
# 使用byrow=T即可按照行來排列

對矩陣的操作(轉置t()、加減+/-、相乘%*%)

  *注意矩陣的相乘!

> a = c(1:12)
> matrix(a,ncol=3,nrow=4)
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12

> a = matrix(a,ncol=3,nrow=4)

> t(a)    #矩陣的轉置
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12

> t(a)+t(a)    #矩陣的相加
     [,1] [,2] [,3] [,4]
[1,]    2    4    6    8
[2,]   10   12   14   16
[3,]   18   20   22   24

> t(a)-t(a)    #矩陣的相減
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]    0    0    0    0
[3,]    0    0    0    0


#############################


> a*a    #矩陣相乘不是這樣求的!!!
     [,1] [,2] [,3]
[1,]    1   25   81
[2,]    4   36  100
[3,]    9   49  121
[4,]   16   64  144

> a%*%a    #矩陣相乘正確表示法-1
Error in a %*% a : 非整合引數

> a%*%t(a)    #矩陣相乘正確表示法-2
     [,1] [,2] [,3] [,4]
[1,]  107  122  137  152
[2,]  122  140  158  176
[3,]  137  158  179  200
[4,]  152  176  200  224

對矩陣的求逆solve()

> a = matrix(rnorm(16),4,4)    #產生16個標準正態函式隨機數形成矩陣
> a
           [,1]        [,2]       [,3]       [,4]
[1,] -0.7916955 -0.12091979  0.8894439 -0.9282618
[2,] -1.0293705 -0.03193216  1.2088014 -0.8579586
[3,]  0.5910502 -0.13763924 -2.0954597  1.2839705
[4,] -1.2613026  1.68569169  1.1454875  0.7667483

> solve(a)    #矩陣求逆
           [,1]      [,2]       [,3]        [,4]
[1,]  0.1013944 -1.414402 -0.8201621 -0.08648724
[2,]  4.4811933 -4.612241 -0.3206119  0.80112951
[3,] -3.2370056  2.449358 -0.5650455 -0.23193872
[4,] -4.8491425  4.154059  0.1998474 -0.25283530

 

 

三:資料框 data.frame()

資料框其實跟矩陣差不多,都是二維表單,但是矩陣中每一個數據都是數值型的,
而資料框中每一列的型別可以是不同的

用法:

x1 = c(1,2,3,4,5,6,7)
x2 = c(5,8,9,5,4,7,6)

x = data.frame(x1,x2)

x = data.frame('重量'=x1,'運費'=x2)




###################################



> x1 = c("aaa","bbb","ty","ju","hh","df","wq")    #這裡雙引號可以,單引號也可以
> x2 = c(1:7)

> cbind(x1,x2)    #列合成矩陣--->>>注意下面輸出資料中的引號
     x1    x2 
[1,] "aaa" "1"
[2,] "bbb" "2"
[3,] "ty"  "3"
[4,] "ju"  "4"
[5,] "hh"  "5"
[6,] "df"  "6"
[7,] "wq"  "7"

> data.frame('重量'=x1,'運費'=x2)    #資料框
  重量 運費
1  aaa    1
2  bbb    2
3   ty    3
4   ju    4
5   hh    5
6   df    6
7   wq    7

 

 

四:利用矩陣求解二維線性方程組(使用solve(a,b)函式)

*solve()在上面也用於矩陣的求逆

現在要求解一個四元線性方程組,可以使用4*4型矩陣進行該四個方程的儲存:

> a = matrix(rnorm(16),4,4)    #產生16個標準正態函式隨機數形成矩陣
> a
           [,1]        [,2]       [,3]       [,4]
[1,] -0.7916955 -0.12091979  0.8894439 -0.9282618
[2,] -1.0293705 -0.03193216  1.2088014 -0.8579586
[3,]  0.5910502 -0.13763924 -2.0954597  1.2839705
[4,] -1.2613026  1.68569169  1.1454875  0.7667483

b = 1,2,3,4

> solve(a,b)
[1] -5.5338453 -2.5006061 -0.9611801  3.0471763

★這裡solve()函式的引數的含義:

 *以第一行為例:(-0.7916955*x1) + (-0.12091979*x2) + (0.8894439*x3) +  (-0.9282618*x4) = 1

 *最後顯示的結果是x1,x2,x3,x4的值。

 

 

 

 

 

****************************************************************************************************************************************

 

             最快的腳步不是跨越,而是繼續,最慢的步伐不是小步,而是徘徊。
 

****************************************************************************************************************************************