线性代数(矩阵、高斯、线性基……)
时间:2021-07-25
本文章向大家介绍线性代数(矩阵、高斯、线性基……),主要包括线性代数(矩阵、高斯、线性基……)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、主要内容
矩阵快速幂、高斯消元、线性基。
二、具体内容
\(1.\) 矩阵
矩阵加法:
相同位置相加。
矩阵乘法:
满足分配率、结合律,不满足交换律(矩阵与逆矩阵之间除外) 。
矩阵转置:
记矩阵为 \(A\) ,则 \(A\) 的转置记为 \(A^T\) 。
性质:
-
\[{(A^T)}^T=A \]
-
\[{(A+B)}^T=A^T+B^T \]
-
\[{(k\times A)}^T=k\times A^T \]
-
\[{(AB)}^T=A^TB^T \]
矩阵求逆:
对左半边的矩阵做高斯消元,同时更新右半边的部分,(交换时也一起交换,但最终不用再换回来了)。而做完之后的右半边部分就是求得的逆矩阵。
\(2.\) 高斯消元
复杂度(朴素): \(O(n^3)\)
主要代码:
scanf("%d",&n);
for(int i=1;i<=n;i++) for(int j=1;j<=n+1;j++) scanf("%lf",&a[i][j]);
for(int i=1,Max=1;i<=n;Max=++i)
{
for(int s=i+1;s<=n;s++) if(fabs(a[s][i])>fabs(a[Max][i])) Max=s; // 找出绝对值最大的
for(int j=1;j<=n+1;j++) swap(a[i][j],a[Max][j]);
if(a[i][i]<10e-8 && a[i][i]>-10e-8) { p=false; break; } // 记得 double 的精度问题
for(int s=1;s<=n;s++) if(s!=i) // 这样省去了第二步处理的麻烦
{
double tmp=0-(a[s][i]/a[i][i]);
a[s][i]=0;
for(int j=i+1;j<=n+1;j++) a[s][j]+=tmp*a[i][j];
}
}
if(p) for(int i=1;i<=n;i++) printf("%.2lf\n",a[i][n+1]/a[i][i]);
else printf("No Solution\n");
\(3.\) 线性基
线性基为一个数集构造出来的新数集,满足以下性质:
-
线性基的元素能相互异或得到原集合的元素的所有相互异或得到的值。
-
线性基是满足性质 \(1\) 的最小的集合。
-
线性基没有异或和为 \(0\) 的子集。
-
线性基中不同的异或组合异或出的数都是不一样的。
-
线性基中每个元素的二进制最高位互不相同。
用处:
-
快速查询一个数是否可以被一堆数异或出来
-
快速查询一堆数可以异或出来的最大 \(/\) 最小值
-
快速查询一堆数可以异或出来的第 \(k\) 大值
\(1.\) 处理线性基
void Insert(ll x)
{
for(int i=62;i>=0;i--)
{
if(!(x & (1ll<<(ll)i))) continue; // 防止对高位影响
if(!p[i]) { p[i]=x; break; }
x^=p[i]; // 更新 [0,i-1] 位的更优答案
}
if(!x) zero=1ll; // 特判 0
}
\(2.\) 查询一个元素是否可以被异或出来
bool ask(ll x)
{
for(int i=62;i>=0;i--) if(x&(1ll<<(ll)i)) x^=p[i];
return x==0;
}
$3. $ 查询异或最大值
ll query_max()
{
ll ret=0;
for(int i=62;i>=0;i--) if((ans^p[i])>ans) ans^=p[i];
return ans;
}
\(4.\) 查询异或最小值
ll query_min()
{
for(int i=0;i<=62;i++) if(p[i]) return p[i];
return 0;
}
\(5.\) 查询异或第 \(k\) 小
void rebuild()
{
// 重建 d 数组,求出哪些位可以被异或为 1
// d[i] 只有第 i 个二进制位为 1
for(int i=62;i>=1;i--) // 从高到低防止后效性
for(int j=i-1;j>=0;j--)
if(p[i] & (1ll<<(ll)j)) p[i]^=p[j];
for(int i=0;i<=62;i++) if(p[i]) d[cnt++]=p[i];
}
ll kth(ll k)
{
if(!k) return 0ll; // 特判 0
if(k>=(1ll<<(ll)cnt)) return -1ll; // k 大于可以表示出的数的个数
ll ret=0;
for(int i=62;i>=0;i--) if(k & (1ll<<(ll)i)) ret^=d[i];
return ret;
}
线性基还可以推广至非二进制的情况。
原文地址:https://www.cnblogs.com/EricQian/p/15057448.html
- 三、请求库之requests模块
- 升级 微信技术输出 时尚新门店尝鲜刷脸支付
- WSP Global品牌升级 启用3声母域名
- 一、爬虫基本原理
- python 中__setattr__, __getattr__,__getattribute__, __call__使用方法
- 量子技术与人工智能:同时进化的双生子
- TCP协议三次握手与四次挥手通俗解析
- Silverlight/aspx/ajax/mvc的UI自动化测试
- Office Open XML学习(1)-创建excel文档,并向单元格中插入字符串
- PyMC3和Theano代码构建贝叶斯深度网络,61页PPT探索贝叶斯深度学习以及实现
- 男程序员是不是都不会和女生表达交流?程序员的回答歪了
- Silverlight Telerik控件学习:主题Theme切换
- Silverlight自定义类库实现应用程序缓存
- Silverlight Telerik控件学习:TreeView数据绑定并初始化选中状态、PanelBar的Accordion效果、TabPanel、Frame基本使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- java学习之路:1.编译器Eclipse安装教程
- 指针作形参,需要注意的问题。
- SetConsoleTextAttribute函数用法
- C语言俄罗斯方块(旧版本)
- 线性表--顺序表--数组(三)
- 算法复杂度(二)
- 线性表--顺序表--单向链表(四)
- C语言俄罗斯方块(新版本完整代码)
- 线性表--顺序表--双向链表(六)
- C/C++什么时候使用二级指针,你知道吗?
- 萌新学习C++容易漏掉的知识点,看看你中招了没有(一)
- 萌新不看会后悔的C++string字符串常用知识点总结
- salesforce零基础学习(九十六)项目中的零碎知识点小总结(四)
- CodeForces - 260C
- 疯子的算法总结(九) 图论中的矩阵应用 Part 2 矩阵树 基尔霍夫矩阵定理 生成树计数 Matrix-Tree