R语言求解矩阵极大无关组并检验是否线性相关
刚上手R一个月,前两天为了交作业实现了极大无关组的求解,看网上并没有相关的代码所以分享一下。不足之处还有很多,希望各位大佬多多指教~
求解的大体思想就是化阶梯形,并且把每个阶梯的第一个元素的索引取出,利用索引得到原矩阵的一组极大无关组,验证是否线性无关只需要利用索引得到化为阶梯形后的子矩阵,子矩阵的秩是否为Min{行秩,列秩}
求解方法改进了一下选取列主元的高斯消去法,在其基础上为列主元的坐标定位指针[i, j],这样可以判断对该列进行高斯消去之后,下一列的主元位置和该列的主元位置,是在同一行还是在同一对角线上。倘若这两列线性相关则在同一行平移,若线性无关则对角线移动。
先简单介绍一下列主元高斯消元法,估计高斯看了棺材板会盖不住的。
在化阶梯形的过程中,比如从A[1, 1](不等于0)开始,将A[i, 1](i = 2, 3, 4....)的元素都化为0,这个过程就是在实现高斯消元。在消元的过程中,被用来消其他元素的那个元素叫做主元。而列主元的高斯消去法指的是每一列消元时,都选择本列绝对值最大的元素作为主元,并把那一行换到指针所在的位置。
为什么在列主元的高斯消去法里没有提指针的事请呢?因为它常用来实现n阶方阵的LU分解,指针默认方向是对角线,不用考虑横向平移的过程。
话不多说分享代码~
清空变量,导入数据清洗包dplyr
rm(list = ls())
library(dplyr)
定义行交换函数
# Reorder rows
rarrange = function(dtf, i1, i2){dtf.i1 = dtf[i1, ]dtf[i1, ] = dtf[i2, ]dtf[i2, ] = dtf.i1return(dtf)
}
主题函数部分,tg.tick是主元所在的行标,貌似which可以直接获取行标行交换更方便
(为了逻辑而放弃了美观,在函数体里加了注释,原谅一只菜鸡)
# Function
MLIG = function(mtx){mdtf = as.data.frame(mtx)i = 1j = 1tg.tick = im = dim(mdtf)[1]n = dim(mdtf)[2]index = NAwhile ((i <= (m-1)) & (j <= n)){colmax = mdtf[i, j]# Find column principal and row.numbers it is infor (t in (i+1) : m){if (abs(as.numeric(mdtf[t, j])) > abs(as.numeric(colmax))){colmax = abs(as.numeric(mdtf[t, j]))tg.tick = t}else{tg.tick = i}}# If column principal not equal to mdtf[i, j], no arrange operationsif (as.numeric(colmax) != mdtf[i, j]){mdtf = rarrange(mdtf, i, tg.tick)}else{}# If column principal not equal to zeroif (colmax != 0){for (t in (i+1):m){k = mdtf[t, j] / mdtf[i, j]mdtf[t, j:n] = mdtf[t, j:n] - mdtf[i, j:n]*k}index = c(index, j)i = i + 1j = j + 1}else{j = j + 1}}index = na.omit(index)result.dtf = select(as.data.frame(mtx), index)check.dtf = mdtfreturn(list(result.dtf = result.dtf, check.dtf = check.dtf))
}
用两个矩阵检验效果
# Effect test
MLIG(matrix(1:24, 4, 6))
MLIG(matrix(sample(1:10, 30, replace = T), 5, 6))
运行结果为
> MLIG(matrix(1:24, 4, 6))
$result.dtfV1 V2
1 1 5
2 2 6
3 3 7
4 4 8$check.dtfV1 V2 V3 V4 V5 V6
1 4 8 12 16 20 24
2 0 3 6 9 12 15
3 0 0 0 0 0 0
4 0 0 0 0 0 0> MLIG(matrix(sample(1:10, 30, replace = T), 5, 6))
$result.dtfV1 V2 V3 V4
1 4 5 6 7
2 9 7 3 8
3 7 2 7 9
4 9 4 4 9
5 7 3 8 4$check.dtfV1 V2 V3 V4 V5 V6
1 4 5.00 6.00000 7.000000 6.000000 4.0000000
2 0 -4.25 -10.50000 -7.750000 -4.500000 -5.0000000
3 0 0.00 13.17647 9.058824 6.647059 7.9411765
4 0 0.00 0.00000 -5.812500 -1.316964 0.7098214
5 0 0.00 0.00000 0.000000 -5.222734 -1.4562212
R语言求解矩阵极大无关组并检验是否线性相关相关推荐
- 怎么根据矩阵判断极大无关组_什么是极大无关组?怎么判别?
展开全部 向量组的极大无关组满足2个条件:62616964757a686964616fe59b9ee7ad9431333431353366 1.自身线性无关. 2.向量组中所有向量可由它线性表示. 例 ...
- 怎么根据矩阵判断极大无关组_如何判断向量是否是矩阵的极大无关组?
首先你这个提问不是很严谨哦ε3ε 极大无关组是向量组里面的概念,而在矩阵里没有极大无关组这个概念,虽然向量组合并在一起可以看成一个矩阵,但不能说矩阵有极大无关组. 我们先从概念出发,极大线性无关组:在 ...
- 怎么根据矩阵判断极大无关组_怎么根据矩阵判断极大无关组_什么是极大无关组?怎么判别?...
展开全部 向量组的极大无关组满足2个条件:62616964757a686964616fe59b9ee7ad9431333431353366 1.自身线性无关. 2.向量组中所有向量可由它线性表示. 例 ...
- 线性代数之极大无关组的求法
线性代数之极大无关组的求法 注:行列式常见计算方法链接汇总 三角法 . 降阶法 .迭代法 .拆分凑 ...
- 如何用matlab判定线性相关并给出极大无关组
学过线性代数都知道,先求出秩,根据秩的大小与向量的阶数比较判断出线性是否相关.求秩matlab用rank函数 rank函数格式 rank(A) 求下列矩阵判断是否线性相关并求出极大无关组 >&g ...
- 向量组极大无关组和向量组的秩
向量组的极大无关组定义 极大无关组包含两层含义:1 极大性,2无关性. 1 线性无关向量组的极大无关组就是其本身: 2 向量组与其极大无关组等价: 3 同一个向量组的极大无关组不唯一,但它们之间是等价 ...
- R语言生存分析Log-rank假设检验组间生存曲线比较实战
R语言生存分析Log-rank假设检验组间生存曲线比较实战 目录 R语言生存分析Log-rank假设检验组间生存曲线比较实战 #log-rank检验
- R语言Logistic回归模型亚组分析森林图(forest plot)绘制
R语言Logistic回归模型亚组分析森林图(forest plot)绘制 目录 R语言Logistic回归模型亚组分析森林图(forest plot)R语言Logistic回归模型亚组分析森林图
- R语言使用t.test函数进行t检验、使用配对的t检验(paired)检验组间不独立数据的差异是否有统计学意义
R语言使用t.test函数进行t检验.使用配对的t检验(paired)检验组间不独立数据的差异是否有统计学意义 目录 R语言使用t.test函数进行t检验.使用配对的t检验(paired)检验组间不独 ...
最新文章
- webkit入门准备
- 让理科生沉默,让文科生落泪的文史综合题
- SPOJ - NSUBSTR Substrings(后缀自动机)
- HBase性能优化方法总结(三):读表操作
- koa操作mongodb,封装mongdb操作方法
- 谷歌收购DNNresearch能获得什么?
- Python - 列表与字典相互转换
- funcode坐标c语言,01 FunCode C 入门.doc
- 5.6 深度卷积神经网络(AlexNet)
- BPMN,BPEL,XPDL
- 【图解CAN总线】-8-CANFD总线网络“负载率”计算
- loj6388 「THUPC2018」赛艇 / Citing
- 光合作用9月五星推荐图书
- ▲ Android自定义方框EditText注册验证码
- CTFshow-命令执行(4)
- 直流有刷电机调速原理及Matlab/Simulink仿真
- 央视春晚歌手王琪,和戏歌双绝吴广全在长春芝华仕会盟
- 解决win7 中powershell挖矿占用CPU100%
- c语言快速复数的比较大小,c语言中的复数操作
- 启元世界获 NeurIPS 2018 多智能体竞赛Learning组冠军,决策智能平台价值凸显...