美文网首页
R--矩阵和数组

R--矩阵和数组

作者: KevinCool | 来源:发表于2016-04-18 10:24 被阅读664次

    矩阵是特殊的向量,包含了两个附加的属性,行数和列数
    数组是更加一般的对象,矩阵是数组的一个特殊情形,数组可以是多维的,三维包含行列层
    矩阵和数组也主要有向量取子集还有向量化运算方面

    创建矩阵

    #矩阵在R中存储是按列存储的
    #使用matrix()函数创建矩阵
    y <- matrix(c(1,2,3,4),nrow=2)
    #获取矩阵元素,分别表示第二列和第二行
    y[,2]
    y[2,]
    #另外一种创建矩阵的方法是为矩阵的每一个元素赋值
    #但是要提前声明是一个矩阵对象,给出行数与列数
    y <- matrix(nrow=2,ncol=2)
    y[1,1] <- 2
    y[1,2] <- 3
    y[2,1] <- 4
    y[2,2] <- 5
    #并且可以指定矩阵的按行排列
    y <- matrix(c(1,2,3,4),nrow=2,byrow=T)
    #这样矩阵本身依然是按列存储的,byrow参数改变的是数据输入的顺序```
    
    #矩阵运算
    

    矩阵相乘%%,数乘,加法 +

    y <- matrix(c(1,2,3,4),nrow=2)
    y%%y
    y+y
    y
    3```

    矩阵索引

    z <- matrix(c(1,2,3,4,5,6),nrow=3)
    z[,1:2]
    z[1:2,]
    z[1:2,1]
    #对子矩阵进行赋值
    z[c(1,3),] <- matrix(c(1,2,3,4),nrow=2)
    #另外一个赋值的例子
    x <- matrix(nrow=3,ncol=3)
    y <- matrix(c(4,5,6,7),nrow=2)
    x[2:3,2:3] <- y
    x
    #使用向量的负值索引排除某些元素
    #排除第2行
    x[-2,]```
    
    #图像操作
    

    图像文件本质就是矩阵,像素点事按照行和列进行排列的

    灰度图像就是灰度存储为矩阵的一个元素上

    彩色图像就是有3个矩阵分别存储RGB```

    矩阵元素筛选

    #一个筛选的例子
    x <- matrix(c(1,2,3,2,3,4),nrow=3)
    x[x[,2]>3,]
    #筛选的核心就是找到匹配后的布尔向量,通过这个布尔向量对其进行索引
    #比如这个是先将x的第二列与3进行比较,当然是向量化的运算,形成一个布尔向量,F,F,T
    #然后x再索引这个布尔向量,也就是x[3,],就是获取x的第三行数据
    #使用其他向量作为筛选条件
    z <- c(5,12,13)
    #获取到x的第一和第三行
    x[z%%2==1,]
    #另外一个比较复杂的例子
    x[x[,1]>1 & x[,2]>2,]
    #注意&是向量之间的逻辑与运算,而&&是if语句中的逻辑运算
    #另外可以使用drop参数避免意外降维
    #适合矩阵的向量运算
    which(x>2)```
    
    #对矩阵的行和列调用函数
    

    使用apply()函数,允许在矩阵的各行和各列上调用指定的函数

    apply(m,d,f) m是要运算的矩阵,d代表维数1是按行应用,2是按列应用,f为要应用的函数

    z <- matrix(c(1,2,3,4,5,6),nrow=3)
    apply(z,2,mean)

    在apply中使用自己定义的函数

    f <- function(x) x/c(2,8)
    y <- apply(z,1,f)

    apply()按行应用函数f,返回一个向量,作为第一列,因此最后结果是23的矩阵,而不是32

    可以使用t()转置函数进行转置

    t(y)

    在apply()函数中应用函数的参数

    copymaj <- function(rw,d){
    maj <- sum(rw[1:d])/d
    return(if(maj<0.5) 1 else 0)
    }
    x <- matrix(c(1,1,0,0,1,1,0,0,0,1,0,1),nrow=3)
    apply(x,1,copymaj,3)

    apply函数的优点并不是将程序速度加快,而是程序更加紧凑,避免循环语句带来的bug

    并且并行运算中,有很大用处,在每个网络节点上对子矩阵调用给定的函数```

    增加或者删除矩阵的行与列

    #向量的重新赋值
    x <- c(1,2,3,4)
    x <- c(x,20)
    x <- x[-2:-4]
    #使用rbind和cbind都可以给矩阵增加行或者列
    one <- c(1,1,1,1)
    z <- matrix(c(1,2,3,4,5,6,7,8),nrow=4)
    cbind(one,z)
    #将one和z合并到一起,形成新矩阵
    #循环补齐
    two <- c(2,2,2)
    cbind(two,z)
    #通过cbind()和rbind()快速生成一些小矩阵
    q <- cbind(c(1,2),c(3,4))
    #最好不要重复来创建新矩阵,而是先定义好一个大矩阵,值是空的,然后对其进行赋值
    #避免每次进行耗时的矩阵内存分配
    #重新赋值来删除矩阵的行或者列
    m <- matrix(1:6,nrow=3)
    m <- m[c(1,3),]
    m```
    
    #向量与矩阵的差异
    

    z <- matrix(1:8,nrow=4)

    计算长度

    length(z)
    class(z)
    attributes(z)

    z不仅仅是一个向量,应该是一个矩阵类,包含维度属性,是由行数和列数的向量组成的

    使用dim()函数来访问dim属性

    dim(z)

    使用nrow()和ncol()来访问

    nrow(z)
    ncol(z)```

    禁止矩阵自动减少维度

    #drop参数
    r <- z[2,,drop=F]
    s <- z[2,]
    dim(r)
    dim(s)
    #需要经常性的在矩阵操作代码中使用参数drop=F
    #对于原本就是向量的对象,使用as.matrix()将其转换为矩阵
    u <- c(1,2,3)
    #默认按列进行排列
    as.matrix(u)```
    
    #行名和列名
    

    z <- matrix(1:8,nrow=4)
    colnames(z) <- c("i","love")
    z[,"i"]
    rownames(z) <- c("a",'b','c','d')
    z['a',]```

    高维数组

    first <- matrix(1:6,nrow=3)
    second <- matrix(7:12,nrow=3)
    #使用array创建高维数组
    #dim参数表明数据有2层,每层3行2列
    test <- array(data = c(first,second),dim=c(3,2,2))
    test[3,1,1]
    #索引的时候也是先索引行列,然后再索引层
    #同样可以把两个或者更多的三维数组合并成四维数据
    #数组常用场合是表的计算```
    

    相关文章

      网友评论

          本文标题:R--矩阵和数组

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