ITPub博客

首页 > 大数据 > 可视化 > R语言矩阵基础操作

R语言矩阵基础操作

原创 可视化 作者:fudaliang1999 时间:2013-12-10 10:00:33 0 删除 编辑

将z数组作为10*10矩阵看待
> z<-1:100
> attr(z,"dim") <- c(10,10)
> 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<-1:100
> 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)<-c(3,5,100)
如果在任何下标给出空值,意味着选择这个下标的所有值。

除了赋予一个向量dim属性外,还可以用array来从向量构建数组。
> b<-array(1:20,dim=c(4,5))
> 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 <-10:15
> b
[1] 10 11 12 13 14 15
> ab <-a %o% b
> 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 <-outer(a,b,"*")  (和上一句等价

数组的广义转置 :我理解就是维度变换,不过对于多为怎么换还是不好理解。

> 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 <- t(cd)
> 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 <-aperm(cd,c(2,1))
> 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<-1:5
> b<-1:5
> 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<-10
> b<-5
> c<-a %*% b
> c
     [,1]
[1,]   50
> solve(a,c)
     [,1]
[1,]    5

最小二乘拟合结果lsfit返回
lsfit(X,y)  其中X为设计矩阵,y是观测值向量

rbind、cbind矩阵组合,在dim(维度)上链接,有些限制,要对齐。文档叫构建分区矩阵。
c函数忽略维度,直接连接,想试链表。
> a<-1:10
> b<-21:30
> 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 <-c("tas", "sa","qld","nsw","nsw","nt","wa","wa","qld", "vic","nsw","vic", "qld","qld", "sa","tas","sa","nt","wa","vic","qld","nsw","nsw","wa","sa","act","nsw","vic","vic","act")
> statef <- factor(state)
> 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 <- c(60, 49, 40, 61, 64, 60, 59, 54, 62, 69, 70, 42, 56,
+              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 <- tapply(incomes, statef, mean)
> 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 <- function(x) sqrt(var(x)/length(x))
> stderr
function(x) sqrt(var(x)/length(x))
> incster <- tapply(incomes, statef, stderr)
> 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 <- table(statef)
>
> statefr <- tapply(statef, statef, length)
>
> 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博客 ” ,链接:https://blog.itpub.net/15711267/viewspace-1062867/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: Xen 虚拟机架构
请登录后发表评论 登录
全部评论

注册时间:2013-10-30

  • 博文量
    45
  • 访问量
    610055