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

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

矩阵的基本操作

#将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    6
 y<-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.75
fargs表示可选参数集
> 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")
> z
     a 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


目录
相关文章
|
29天前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
55 4
|
3月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
475 8
|
3月前
|
机器学习/深度学习
R语言模型评估:深入理解混淆矩阵与ROC曲线
【9月更文挑战第2天】混淆矩阵和ROC曲线是评估分类模型性能的两种重要工具。混淆矩阵提供了模型在不同类别上的详细表现,而ROC曲线则通过综合考虑真正率和假正率来全面评估模型的分类能力。在R语言中,利用`caret`和`pROC`等包可以方便地实现这两种评估方法,从而帮助我们更好地理解和选择最适合当前任务的模型。
|
7月前
|
BI 索引
R语言数据结构-----向量
R语言数据结构-----向量
36 4
|
7月前
|
存储 机器学习/深度学习 人工智能
数据结构(五)----特殊矩阵的压缩存储
数据结构(五)----特殊矩阵的压缩存储
311 3
|
7月前
|
索引
R语言数据结构-----列表
R语言数据结构-----列表
43 3
|
7月前
|
机器学习/深度学习 数据可视化 数据挖掘
R语言逻辑回归logistic对ST股票风险建模分类分析混淆矩阵、ROC曲线可视化
R语言逻辑回归logistic对ST股票风险建模分类分析混淆矩阵、ROC曲线可视化
|
7月前
|
存储 数据处理 数据库
R语言入门:基础语法和数据结构
【4月更文挑战第25天】本文为R语言初学者提供入门指南,介绍R语言起源、安装配置、基本语法、数据类型和结构、数据操作以及统计和图形绘制。R语言是强大的统计分析工具,拥有丰富数据处理功能和活跃社区。通过学习变量赋值、控制结构、向量、矩阵、数组、数据框和列表,以及数据导入导出、筛选修改,可奠定R语言基础。掌握基础后,可进一步探索其在统计计算和图形绘制中的应用。
87 2
|
7月前
|
机器学习/深度学习 搜索推荐 数据挖掘
R语言矩阵特征值分解(谱分解)和奇异值分解(SVD)特征向量分析有价证券数据
R语言矩阵特征值分解(谱分解)和奇异值分解(SVD)特征向量分析有价证券数据
|
7月前
|
机器学习/深度学习 数据可视化
R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化(下)
R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化