矩阵

Java 矩阵行列式算法(非高斯消元)

≯℡__Kan透↙ 提交于 2020-04-15 16:16:34
【推荐阅读】微服务还能火多久?>>> 最近由于项目任务较少,手上有不少空闲的时间,所以抽空研究了一下矩阵行列式的算法。 先来说说行列式,以下摘自百度百科: 行列式在数学中,是由解线性方程组产生的一种算式。行列式的特性可以被概括为一个多次交替线性形式,这个本质使得行列式在欧几里德空间中可以成为描述“体积”的函数。 [1] 其定义域为nxn的矩阵A,取值为一个标量,写作det(A)或 | A | 。行列式可以看作是有向面积或体积的概念在一般的欧几里得空间中的推广。或者说,在n维欧几里得空间中,行列式描述的是一个线性变换对“体积”所造成的影响。无论是在线性代数、多项式理论,还是在微积分学中(比如说换元积分法中),行列式作为基本的数学工具,都有着重要的应用。 行列式概念最早出现在解线性方程组的过程中。十七世纪晚期,关孝和与莱布尼茨的著作中已经使用行列式来确定线性方程组解的个数以及形式。十八世纪开始,行列式开始作为独立的数学概念被研究。 十九世纪以后,行列式理论进一步得到发展和完善。矩阵概念的引入使得更多有关行列式的性质被发现,行列式在许多领域都逐渐显现出重要的意义和作用,出现了线性自同态和向量组的行列式的定义。 n阶行列式的计算公式: 设有n²个数,排列成n行n列的表 a11 a12 ... a1n a21 a22 ... a2n ... ... ... ... an1 an2 ...

【线性代数的本质】矩阵、线性变换、矩阵乘法与线性变换复合

微笑、不失礼 提交于 2020-04-08 11:49:49
线性代数的本质,源视频 https://www.bilibili.com/video/BV1ys411472E @ 目录 矩阵和线性变换 矩阵乘法与复合变换 Unfortunately, no one can be told what the Matrix is. You have to see it for your self. ------ Morpheus 矩阵是什么? 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵。而行数与列数都等于n的矩阵称为n阶矩阵或n阶方阵。 在线性代数中,最容易被忽略但是非常重要的一点就是线性变换的概念以及它和矩阵的关系。 矩阵和线性变换 对于变换,变换其实就是函数的另外一种说法,它接受一个输入,然后输出对应的结果。 特别的,在线性代数下,我们考虑的是接受一个向量并且输出一个向量的变换。 为什么要用变换呢? 因为 变换 是在暗示以特定的方式来可视化这 输入-输出 关系,一种理解向量的函数的方式是使用运动。 例如在二维空间中,我们将一个输入向量移动到输出向量的位置,要理解整个变换,我们可以想象每一个输入向量输出到对应输出向量的位置。 二维空间在这种变化时候,我们可以对无限网格上的所有点同时做变换,还可以保留原来坐标的网格,以便追踪起点和终点的位置。 那么什么是线性变换呢

刷题240. Search a 2D Matrix II

≡放荡痞女 提交于 2020-04-08 09:01:22
一、题目说明 题目240. Search a 2D Matrix II,从一个m*n的二维矩阵查找一个整数,每一行从左到右递增,每一列从上到下递增。 二、我的解答 先计算矩阵中点 matrix[row_mid][col_mid] ,然后将矩阵分成4个区间: class Solution{ public: bool dfs(vector<vector<int> >& matrix,int target,int start_x, int end_x, int start_y, int end_y){ if(start_x > end_x || start_y > end_y) return false; if(start_x == end_x && start_y == end_y) return matrix[start_x][start_y] == target; if(target < matrix[start_x][start_y] || target > matrix[end_x][end_y]) return false; int mid_x = start_x + (end_x - start_x) / 2; int mid_y = start_y + (end_y - start_y) / 2; if(matrix[mid_x][mid_y] == target) {

LeetCode 面试题 01.07. 旋转矩阵

妖精的绣舞 提交于 2020-04-07 15:56:20
题目 给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法, 将图像旋转 90 度。不占用额外内存空间能否做到? 示例 给定 矩阵 [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ] 思路:先将其写斜对角线翻折,再对每行以中点为中心翻折 [1,2,3], [1,4,7], [7,4,1], [4,5,6], ===> [2,5,8], ===> [8,5,2], [7,8,9] [3,6,9] [9,6,3] 代码 public void rotate(int[][] matrix) { for(int i=0; i<matrix.length; i++){ for(int j=i+1; j<matrix[0].length; j++){ int t = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = t; } } int n = matrix.length; int mid = n/2; for(int i=0; i<matrix.length; i++){ for(int j=0; j<mid; j++){ int t = matrix[i][j]; matrix[i][j]

LeetCode 48. 旋转图像

半城伤御伤魂 提交于 2020-04-07 15:31:58
我的LeetCode: https://leetcode-cn.com/u/ituring/ 我的LeetCode刷题源码[GitHub]: https://github.com/izhoujie/Algorithmcii LeetCode 48. 旋转图像 题目 给定一个 n × n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 说明: 你必须在__原地__旋转图像,这意味着你需要直接修改输入的二维矩阵。__请不要__使用另一个矩阵来旋转图像。 示例 1: 给定 matrix = [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入矩阵,使其变为: [ [7,4,1], [8,5,2], [9,6,3] ] 示例 2: 给定 matrix = [ [ 5, 1, 9,11], [ 2, 4, 8,10], [13, 3, 6, 7], [15,14,12,16] ], 原地旋转输入矩阵,使其变为: [ [15,13, 2, 5], [14, 3, 4, 1], [12, 6, 8, 9], [16, 7,10,11] ] 来源:力扣(LeetCode) 链接: https://leetcode-cn.com/problems/rotate-image 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解题思路 本题实际不难

弱题(循环矩阵)

余生颓废 提交于 2020-04-07 15:20:37
题目描述 有 M 个球,一开始每个球均有一个初始标号,标号范围为1~ N 且为整数,标号为 i 的球有 a i 个,并 保证 Σ a i = M 。 每次操作 等概率 取出一个球(即取出每个球的概率均为1/ M ),若这个球标号为 k ( k < N ),则将它重新标号为 k + 1;若这个球标号为 N ,则将其重标号为1。 (取出球后并不将其丢弃) 现在你需要求出,经过 K 次这样的操作后,每个标号的球的期望个数。 输入 第1行包含三个 正整数 N , M , K ,表示了标号与球的个数以及操作次数。 第2行包含 N 个 非负整数 a i ,表示初始标号为 i 的球有 a i 个。 输出 应包含 N 行,第 i 行为标号为 i 的球的期望个数,四舍五入保留3位小数。 f[i]表示标号为i的期望个数,f[i]=(m-1)/m*f[i]+1/m*f[i-1] 每轮结束后,f[i]只与上一轮的f[i]和f[i-1]有关 m-1/m 1/m 1/m m-1/m 1/m m-1/m 因为构造矩阵的每一行都和第一行有关系,所以每一次矩阵乘先乘出a[1][i]的结果,再用第一行a[1][i]去更新 2---n-1行 #include<iostream> #include<cstdio> #include<cstring> #define N 1005 using namespace std;

矩阵乘法递归求解

两盒软妹~` 提交于 2020-04-07 09:01:31
给定两个N×N的矩阵,求乘积 如下图所示,乘法执行过程如下: 1.矩阵1先拿出一行,矩阵2先拿出一列 2.行与列相乘得到value1 3.行与剩下矩阵2相乘得到value2(递归过程) 4.剩下矩阵1与列相乘得到value3(递归过程) 5.剩下矩阵1与剩下矩阵2相乘得到value4(递归过程) 6.将value1~value4合并成结果数组 写代码时注意约定,value1一定是数值,value2、value3、value4是数值、空数组或者非空的二维数组 由php实现,大体思路不难,但是要非常注意合并结果的细节: 1 <?php 2 3 class MatrixProduct 4 { 5 protected $matrix1, $matrix2; 6 protected $result; 7 8 public function __construct($matrix1, $matrix2) 9 { 10 $this->matrix1 = $matrix1; 11 $this->matrix2 = $matrix2; 12 $this->result = $this->matrixProduction($this->matrix1, $this->matrix2); 13 } 14 15 public function show() 16 { 17 foreach ($this-

矩阵快速幂模板

血红的双手。 提交于 2020-04-07 08:33:16
第一部分:矩阵的基础知识 1.结合性 (AB)C=A(BC). 2.对加法的分配性 (A+B)C=AC+BC,C(A+B)=CA+CB . 3.对数乘的结合性 k(AB)=(kA)B =A(kB). 4.关于转置 (AB)'=B'A'. 一个矩阵就是一个二维数组,为了方便声明多个矩阵,我们一般会将矩阵封装一个类或定义一个矩阵的结构体,我采用的是后者。(弱鸡的我也直只会用结构体实现) 第二部分:矩阵相乘 若A为n×k矩阵,B为k×m矩阵,则它们的乘积AB(有时记做A·B)将是一个n×m矩阵。前一个矩阵的列数应该等于后一个矩阵的行数,得出的矩阵行数等于前一个矩阵的行数,列数等于后一个矩阵的行数。 其乘积矩阵AB的第i行第j列的元素为: 举例:A、B均为3*3的矩阵:C=A*B,下面的代码会涉及到两种运算顺序,第一种就是直接一步到位求,第二种就是每次求一列,比如第一次,C00+=a00*b00,C01+=a00*b01……第二次C00+=a00*b10,C01+=a01*b11……以此类推。。。 C00 = a00*b00 + a01*b10 + a02*b20 C01 = a00*b01 + a01*b11 + a02*b21 C02 = a00*b02 + a01*b12 + a02*b22 C10 = a10*b00 + a11*b10 + a12*b20 C11 = a10

矩阵快速幂&T1

落爺英雄遲暮 提交于 2020-04-07 08:19:00
T1 知识储备 在写这一题之前,我们首先要了解矩阵乘法(我就是因为不懂弄了好久...) 矩阵的运算()-----(信息学奥赛一本通之提高篇) 矩阵的加法减法是十分简单的,就是把2个矩阵上对应的位置相加减 矩阵乘法 1.我们要满足A矩阵的列数和B矩阵的行数相等 2.如果A是一个n*r的矩阵,B是一个r*m的矩阵,那么A和B的乘积C是一个n*m的矩阵 3.C i,j= a i,1 *b 1,j +a i,2 *b 2,j +a i,3 *b 3,j +...+a i,r *b r,j ; 由以上我们要得出一个重要的结论,就是:矩阵乘法满足结合律即A*B+A*C=A*(B+C) 方阵乘幂 A是一个方阵,将A连成n次,即:C=A n 如果不是方阵就不能进行乘幂运算,然后由我们上面得出来的矩阵乘法满足结合律,因此我们可以用快速幂的方法求解解 矩阵乘法的应用 1.通过状态矩阵和状态转移矩阵相乘可以快速得到一次DP的值 2.求矩阵相乘的结果是要做很多次乘法,这样的效率非常慢甚至不如原来的DP转移.所以我们可以先算后面的转移矩阵,并将其与初始矩阵相乘得到结果,算法的时间复杂度为log(n)级别 矩阵快速幂 恩恩,直接上代码 1 #include<bits/stdc++.h> 2 #define ll long long 3 #define FOR(i,a,b) for(register ll i

稀疏数组

守給你的承諾、 提交于 2020-04-07 00:01:01
稀疏数组 介绍 当我们在处理如五子棋这类棋盘问题时,只有棋盘中的黑子和白字位置对于我们来说是由具体意义的,当一个二维数组中的绝大多数值都是某一个值时,我们选定位默认值,我们可以使用稀疏数组来保存,以达到节约空间的目的 处理过程 创建一个n+1行3列的二维数组(n为待压缩数组中不同于选定默认值的个数) 在第一行分别保存待压缩数组的行数、列数、n 对每一个不同于默认值的值按照行号、列号、值记录一行 把一个二维数组压缩为稀疏数组 public class SparseArray { public int[][] array2SparseArray(int[][] res){ int n=0; for(int i=0;i<res.length;i++) { for(int j=0;j<res[i].length;j++) { if(res[i][j]!=0) { n++; } } } int[][] tar=new int[n+1][3]; tar[0][0]=res.length; tar[0][1]=res[0].length; tar[0][2]=n; int row=1; for(int i=0;i<res.length;i++) { for(int j=0;j<res[i].length;j++) { if(res[i][j]!=0) { tar[row][0]=i; tar