R語言矩陣基礎操作

fudaliang1999發表於2013-12-10

將z陣列作為10*10矩陣看待
> z > attr(z,"dim") > z
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1   11   21   31   41   51   61   71   81    91
 [2,]    2   12   22   32   42   52   62   72   82    92
 [3,]    3   13   23   33   43   53   63   73   83    93
 [4,]    4   14   24   34   44   54   64   74   84    94
 [5,]    5   15   25   35   45   55   65   75   85    95
 [6,]    6   16   26   36   46   56   66   76   86    96
 [7,]    7   17   27   37   47   57   67   77   87    97
 [8,]    8   18   28   38   48   58   68   78   88    98
 [9,]    9   19   29   39   49   59   69   79   89    99
[10,]   10   20   30   40   50   60   70   80   90   100

> b > b
  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14
 [15]  15  16  17  18  19  20  21  22  23  24  25  26  27  28
 [29]  29  30  31  32  33  34  35  36  37  38  39  40  41  42
 [43]  43  44  45  46  47  48  49  50  51  52  53  54  55  56
 [57]  57  58  59  60  61  62  63  64  65  66  67  68  69  70
 [71]  71  72  73  74  75  76  77  78  79  80  81  82  83  84
 [85]  85  86  87  88  89  90  91  92  93  94  95  96  97  98
 [99]  99 100
 
z有1500個元素組成的向量,下面語句使他具有dim屬性,並且被當作3*5*100的陣列進行處理。
dim(z) 如果在任何下標給出空值,意味著選擇這個下標的所有值。

除了賦予一個向量dim屬性外,還可以用array來從向量構建陣列。
> b > b
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

資料外積操作。維數向量和有原陣列連線而成,屬性和操作屬性有關。資料向量有a的所有向量和b的所有向量的所有可能乘機產生
> a
[1] 1 2 3 4 5
> b > b
[1] 10 11 12 13 14 15
> ab > ab
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   10   11   12   13   14   15
[2,]   20   22   24   26   28   30
[3,]   30   33   36   39   42   45
[4,]   40   44   48   52   56   60
[5,]   50   55   60   65   70   75
cd

陣列的廣義轉置 :我理解就是維度變換,不過對於多為怎麼換還是不好理解。

> cd
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   10   11   12   13   14   15
[2,]   20   22   24   26   28   30
[3,]   30   33   36   39   42   45
[4,]   40   44   48   52   56   60
[5,]   50   55   60   65   70   75
如果A和B同樣大小的方陣,那麼結果即使對應元素的乘機。
> ab *cd
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]  100  121  144  169  196  225
[2,]  400  484  576  676  784  900
[3,]  900 1089 1296 1521 1764 2025
[4,] 1600 1936 2304 2704 3136 3600
[5,] 2500 3025 3600 4225 4900 5625


> e > e
     [,1] [,2] [,3] [,4] [,5]
[1,]   10   20   30   40   50
[2,]   11   22   33   44   55
[3,]   12   24   36   48   60
[4,]   13   26   39   52   65
[5,]   14   28   42   56   70
[6,]   15   30   45   60   75
> f > f
     [,1] [,2] [,3] [,4] [,5]
[1,]   10   20   30   40   50
[2,]   11   22   33   44   55
[3,]   12   24   36   48   60
[4,]   13   26   39   52   65
[5,]   14   28   42   56   70
[6,]   15   30   45   60   75

> f  陣列行列
     [,1] [,2] [,3] [,4] [,5]
[1,]   10   20   30   40   50
[2,]   11   22   33   44   55
[3,]   12   24   36   48   60
[4,]   13   26   39   52   65
[5,]   14   28   42   56   70
[6,]   15   30   45   60   75
> nrow(f)
[1] 6
> ncol(f)
[1] 5

a %*% B 是矩陣乘積,1*n陣列和n*1陣列可以看作是一個n維向量。
> a > b > a %*% b
     [,1]
[1,]   55
> a
[1] 1 2 3 4 5
> b
[1] 1 2 3 4 5
> crossprod(a,b)
     [,1]
[1,]   55
> t(a) %*% b
     [,1]
[1,]   55

猜測,只是不知道如何解釋他們的現實意義。

 1 2  3  4  5
 2 4  6  8  10
 3 6  9  12 15
 4 8  12 16 20
 5 10 15 20 25
 1+4+9 +16 +25 =  55
 
線性方程和矩陣的轉:求解線性方程是矩陣乘法的逆運算。
solve(c) 程式碼1/c c的倒數。會損失精度。

> a > b > c > c
     [,1]
[1,]   50
> solve(a,c)
     [,1]
[1,]    5

最小二乘擬合結果lsfit返回
lsfit(X,y)  其中X為設計矩陣,y是觀測值向量

rbind、cbind矩陣組合,在dim(維度)上鍊接,有些限制,要對齊。文件叫構建分割槽矩陣。
c函式忽略維度,直接連線,想試連結串列。
> a > b > cbind(a,b)
       a  b
 [1,]  1 21
 [2,]  2 22
 [3,]  3 23
 [4,]  4 24
 [5,]  5 25
 [6,]  6 26
 [7,]  7 27
 [8,]  8 28
 [9,]  9 29
[10,] 10 30
> rbind(a,b)
  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
a    1    2    3    4    5    6    7    8    9    10
b   21   22   23   24   25   26   27   28   29    30
> c(a,b)
 [1]  1  2  3  4  5  6  7  8  9 10 21 22 23 24 25 26 27 28 29
[20] 30

說明:state陣列和incomes具有相同元素
> state > statef > statef
 [1] tas sa  qld nsw nsw nt  wa  wa  qld vic nsw vic qld qld
[15] sa  tas sa  nt  wa  vic qld nsw nsw wa  sa  act nsw vic
[29] vic act
Levels: act nsw nt qld sa tas vic wa
> levels(statef)
[1] "act" "nsw" "nt"  "qld" "sa"  "tas" "vic" "wa"
> incomes +              61, 61, 61, 58, 51, 48, 65, 49, 49, 41, 48, 52, 46,
+              59, 46, 58, 43)
>
> incomes
 [1] 60 49 40 61 64 60 59 54 62 69 70 42 56 61 61 61 58 51 48
[20] 65 49 49 41 48 52 46 59 46 58 43
> incmeans > incmeans
     act      nsw       nt      qld       sa      tas      vic        wa
44.50000 57.33333 55.50000 53.60000 55.00000 60.50000 56.00000    52.25000

> stderr > stderr
function(x) sqrt(var(x)/length(x))
> incster > incster
     act      nsw       nt      qld       sa      tas      vic         wa
1.500000 4.310195 4.500000 4.106093 2.738613 0.500000 5.244044   2.657536

> statefr >
> statefr >
> factor(cut(incomes, breaks = 35+10*(0:7))) -> incomef
> table(incomef,statef)
         statef
incomef   act nsw nt qld sa tas vic wa
  (35,45]   1   1  0   1  0   0   1  0
  (45,55]   1   1  1   1  2   0   1  3
  (55,65]   0   3  1   3  2   2   2  1
  (65,75]   0   1  0   0  0   0   1  0

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15711267/viewspace-1062867/,如需轉載,請註明出處,否則將追究法律責任。

相關文章