当前位置: 首页 > news >正文

R语言中的数据结构----矩阵

目录

(1)创建矩阵

(2) 线性代数运算

(3)矩阵索引

(4)矩阵元素的筛选

(5)增加或删除矩阵的行或列

(6)apply()函数

(7)矩阵和向量的区别

(8)避免意外降维

(9)矩阵行和列的命名

(10)高维数组


矩阵的基本操作

#将c(1,4)和c(1,2)两个向量绑定起来
> m<-rbind(c(1,4),c(2,2))
> m[,1] [,2]
[1,]    1    4
[2,]    2    2
#计算向量(1,1)和m的矩阵积
> m%*%c(1,1)[,1]
[1,]    5
[2,]    4
#第一行第二列
> m[1,2]
[1] 4
#第二行第二列
> m[2,2]
[1] 2
#第一行
> m[1,]
[1] 1 4
#第二列
> m[,2]
[1] 4 2
> 

(1)创建矩阵

法一

> y<-matrix(c(1,2,3,4),nrow=2,ncol=2)
> y[,1] [,2]
[1,]    1    3
[2,]    2    4
#可以只定义nrow和ncol中的一个
> y<-matrix(c(1,2,3,4),nrow=2)
> y[,1] [,2]
[1,]    1    3
[2,]    2    4
#表示创建矩阵第二列
> y[,2]
[1] 3 4

法二

#byrow参数设置为TRUE,使矩阵元素按行排列
> m<-matrix(c(1,2,3,4,5,6),nrow=2,byrow=T)
> m[,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6y<-matrix(nrow=2,ncol = 2)
> y[1,1]<-1
> y[2,1]<-2
> y[1,2]<-3
> y[2,2]<-4
> y[,1] [,2]
[1,]    1    3
[2,]    2    4

(2) 线性代数运算

#矩阵相乘
> y%*%y[,1] [,2]
[1,]    7   15
[2,]   10   22
#矩阵数量乘法
> 3*y[,1] [,2]
[1,]    3    9
[2,]    6   12
#矩阵加法
> y+y[,1] [,2]
[1,]    2    6
[2,]    4    8

(3)矩阵索引

•使用逗号,分隔行和列索引来访问矩阵中的元素

# 创建一个3x3的矩阵
mat <- matrix(1:9, nrow = 3)
mat# 访问特定元素
mat[2, 3]  # 访问第2行第3列的元素,输出为6#也可以使用
> "["(z,3,2)
[1] 7
#"["相当于一个函数# 访问整行或整列
mat[1, ]  # 访问第1行的所有元素,输出为 1 4 7
mat[, 2]  # 访问第2列的所有元素,输出为 2 5 8# 访问多行或多列
mat[2:3, ]  # 访问第2行和第3行的所有元素
mat[, c(1, 3)]  # 访问第1列和第3列的所有元素

•使用逻辑向量来选择满足特定条件的行或列

# 创建一个3x3的矩阵
mat <- matrix(1:9, nrow = 3)
mat# 使用逻辑向量进行索引
mat[mat > 5]  # 选择大于5的元素,输出为 6 7 8 9
mat[mat[, 2] > 3, ]  # 选择第2列大于3的行的所有元素

•对一个矩阵的子矩阵进行赋值

> y<-matrix(c(1:6),nrow=3)
> y[,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
#第一行和第三行赋值
> y[c(1,3),]<-matrix(c(1,1,8,12),nrow=2)
> y[,1] [,2]
[1,]    1    8
[2,]    2    5
[3,]    1   12> x<-matrix(nrow=3,ncol=3)
> y<-matrix(c(4,5,2,3),nrow=2)
> y[,1] [,2]
[1,]    4    2
[2,]    5    3
> x[2:3,2:3]<-y
> x[,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA    4    2
[3,]   NA    5    3

(4)矩阵元素的筛选

> x<-matrix(c(1,2,3,2,3,4),nrow=3)
> x[,1] [,2]
[1,]    1    2
[2,]    2    3
[3,]    3    4
#判断第二列元素是否>=3,若>=3,则输出
> x[x[,2]>=3,][,1] [,2]
[1,]    2    3
[2,]    3    4
逐步分解为
> j<-x[,2]>=3
> j
[1] FALSE  TRUE  TRUE
#x[j,]的行与向量j中的取值为TRUE的行对应
> x[j,][,1] [,2]
[1,]    2    3
[2,]    3    4> x<-matrix(c(1:6),nrow=3)
> x[,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
> z<-c(5,12,13)
#z%%2==1用于判断z的每个元素是否是奇数,返回的结果是(TRUE,FALSE,TRUE)
#因此我们提取第1,3行的数据
> x[z%%2==1,][,1] [,2]
[1,]    1    4
[2,]    3    6
注意:如果写为以下形式,就不是以矩阵形式显示了
>x[z%%2==1]
[1] 1 3 4 6> x[,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
#这里用了&,表示两个条件都需要判断
> x[x[,1]>1 & x[,2]>5,]
[1] 3 6#which(m>2)来查找矩阵m中大于2的元素的索引
> m<-matrix(c(5,2,9,-1,10,11),nrow=3)
> m[,1] [,2]
[1,]    5   -1
[2,]    2   10
[3,]    9   11
> which(m>2)
[1] 1 3 5 6
#m的1,3,5,6个元素大于2

(5)增加或删除矩阵的行或列

> x<-c(12,5,13,16,8)
> x
[1] 12  5 13 16  8
> x<-c(x,20)
> x
[1] 12  5 13 16  8 20
> x<-c(x[1:3],20,x[4:6])
> x
[1] 12  5 13 20 16  8 20
> x<-x[-2:-4]
> x
[1] 12 16  8 20
> one<-c(1,1,1,1)
> z<-matrix(c(1,2,3,4,1,1,0,0,1,0,1,0),nrow=4)
> z[,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    1    0
[3,]    3    0    1
[4,]    4    0    0
> cbind(one,z)one      
[1,]   1 1 1 1
[2,]   1 2 1 0
[3,]   1 3 0 1
[4,]   1 4 0 0#1被循环补齐为由4个1组成的列向量
> cbind(1,z)[,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    1    2    1    0
[3,]    1    3    0    1
[4,]    1    4    0    0#和创建向量一样,创建一个新的矩阵很消耗时间
> q<-cbind(c(1,2),c(3,4))
> q[,1] [,2]
[1,]    1    3
[2,]    2    4#可以通过重新赋值来删除矩阵的行或列
> m<-matrix(1:6,nrow=3)
> m[,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6> m<-m[c(1,3),]
> m[,1] [,2]
[1,]    1    4
[2,]    3    6

(6)apply()函数

apply()函数的格式

apply(m,dimcode,f,farge)

m代表一个矩阵

dimcode表示维度代码,1表示每一行应用函数,2表示每一列应用函数

f是应用在行,列上的函数

farge是f的可选参数集

> z<-matrix(c(1:6),nrow = 3)
> z[,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
> apply(z,2,mean)
#或者可以直接使用colMeans
> colMeans(z)
[1] 2 5这里的f可以是自定义函数
> f<-function(x){
+ return(x/c(2,8))
+ }
> y<-apply(z,1,f)
> y[,1]  [,2] [,3]
[1,]  0.5 1.000 1.50
[2,]  0.5 0.625 0.75fargs表示可选参数集
> copymag<-function(rw,d){
#向量每个元素对应矩阵的每行,如果该行前d个元素中1较多,向量对应元素就取1,反之取0
+ maj<-sum(rw[1:d])/d
+ return(if(maj>0.5)1 else 0)
+ }
> x<-matrix(c(1,1,1,0,0,1,0,1,1,1,0,1,1,1,1,1,0,0,1,0),nrow = 4)
> x[,1] [,2] [,3] [,4] [,5]
[1,]    1    0    1    1    0
[2,]    1    1    1    1    0
[3,]    1    0    0    1    1
[4,]    0    1    1    1    0
> apply(x,1,copymag,3)
[1] 1 1 0 1> apply(x,1,copymag,2)
[1] 0 1 0 0
#这里的3,2是函数copymaj()中形式参数d的实际取值,矩阵的第一行是(1,0,1,1,0),当d取3时,前3个是(1,0,1),1占多数,则copymag返回1,第一个元素为1,其他以此类推> apply(x,2,copymag,2)
[1] 1 0 1 1 0

(7)矩阵和向量的区别

> z<-matrix(c(1:8),nrow = 4)
> z[,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    7
[4,]    4    8
#z作为1个向量,可以求他的长度
> length(z)
[1] 8#z也是一个矩阵,有矩阵的性质
> dim(z)
[1] 4 2
> nrow(z)
[1] 4
> ncol(z)
[1] 2#得到矩阵的行数和列数,[1]显示行数,[2]显示列数
> nrow<-function(x)
+ dim(x)[1]
> nrow(z)
[1] 4
> 

(8)避免意外降维

> z[,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    7
[4,]    4    8
> r<-z[2,]
> r
[1] 2 6
#这里的r是一个长度为2的向量,而不是一个1*2的矩阵,所以出现了降维,如何避免降维呢可以用以下方法验证
> attributes(z)
$dim
[1] 4 2> attributes(r)
NULL
> str(z)int [1:4, 1:2] 1 2 3 4 5 6 7 8
> str(r)int [1:2] 2 6可以用drop()参数
> r<-z[2,,drop=FALSE]
#r是一个1*2的矩阵
> r[,1] [,2]
[1,]    2    6
> dim(r)
[1] 1 2

(9)矩阵行和列的命名

> z<-matrix(c(1:4),nrow = 2)
> z[,1] [,2]
[1,]    1    3
[2,]    2    4
> colnames(z)
NULL
> colnames(z)<-c("a","b")
> za b
[1,] 1 3
[2,] 2 4
> colnames(z)
[1] "a" "b"
> z[,"a"]
[1] 1 2

(10)高维数组

> firsttest<-matrix(c(46,21,50,30,25,48),nrow=3)
> secondtest<-matrix(c(46,41,50,43,35,49),nrow=3)> test<-array(data=c(firsttest,secondtest),dim=c(3,2,2))#共有2层,每层分别是3行2列
> attributes(test)
$dim
[1] 3 2 2#学生3第一次考试,第二部分的得分
> test[3,2,1]
[1] 48
#逐层显示
> print(test)
, , 1[,1] [,2]
[1,]   46   30
[2,]   21   25
[3,]   50   50, , 2[,1] [,2]
[1,]   46   43
[2,]   41   35
[3,]   50   50
http://www.lryc.cn/news/165290.html

相关文章:

  • Llama-2 推理和微调的硬件要求总结:RTX 3080 就可以微调最小模型
  • C++多线程的用法(包含线程池小项目)
  • react ant ice3 实现点击一级菜单自动打开它下面最深的第一个子菜单
  • 关于 Qt串口不同电脑出现不同串口号打开失败 的解决方法
  • 可观测性在灰度发布中的应用
  • vscode开发油猴插件环境配置指南
  • 网站不收录没排名降权怎么处理-紧急措施可恢复网站
  • C++vector模拟实现
  • 《DATASET DISTILLATION》
  • GDPU 数据结构 天码行空1
  • 【C++】红黑树的模拟实现
  • 【多线程】Thread 类 详解
  • LINUX 网络管理
  • refresh rate
  • 使用 NGINX Unit 实施应用隔离
  • 2023/09/12 qtc++
  • 全科医学科常用评估量表汇总,建议收藏!
  • 了解消息中间件的基础知识
  • 【linux】Linux wps字体缺失、加粗乱码解决
  • 每日两题 103二叉树的锯齿形层序遍历(数组) 513找树左下角的值(队列)
  • ROS2报错:ImportError: cannot import name ‘Log‘ from ‘rosgraph_msgs.msg‘
  • 【Vue】Vue中的代码分为哪几种类型?
  • es6中includes用法
  • QT中QRadioButton实现分组C++
  • kafka实战报错解决问题
  • vite+react 使用 react-activation 实现缓存页面
  • 【android 蓝牙开发——蓝牙耳机】
  • Golang goroutine 进程、线程、并发、并行
  • 如何做到安全上网
  • 优维低代码实践:菜单