矩阵

数据结构与算法——串、数组和广义表(特殊矩阵的压缩存储)

吃可爱长大的小学妹 提交于 2020-02-26 22:29:05
特殊矩阵的压缩存储 矩阵的常规存储:将矩阵描述为一个二维数组。 矩阵的常规存储的特点:1、可以对其元素进行随机存取;2、矩阵运算非常简单;3、存储的密度为1. 特殊矩阵:值相同的元素很多且呈某种规律分布;零元素多。(对称矩阵、对角矩阵、三角矩阵、稀疏矩阵) 压缩存储:若多个数据元素的值都相同,则只分配一个元素值的存储空间,且零元素不占存储空间。 1、对称矩阵 特点:a ij =a ji (1<=i,j<=n) 存储方法:只存储下(或上)三角包括主对角线的数据元素,共占用n(n+1)/2个元素空间。 存储结构:可以以行序为主序将元素存放在一个一维数组中。 元素 a 11 a 21 a 31 a 32 … a nn k 0 1 2 3 … n(n+1)/2-1 下半三角:对于a ij 来说,其在一维数组中的下标k=i(i-1)/2+j-1。 2、对角矩阵 3、对角矩阵 对角矩阵使用二维数组进行存储。以0为主对角线展开。 4、稀疏矩阵 矩阵中非零元素占所有元素小于5%的矩阵叫稀疏矩阵。 存储方法: 1、三元组顺序存储 ,包括非零元素所在行和所在列以及非零元素的值,再加上矩阵的大小(总行数,总列数)。 例如:{(1 (行) ,2 (列) ,12 (值) ),(3,5,25),… } 三元顺序表优点 :非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。 缺点 :不能随机存取

剑指offer打卡|矩阵中的路径

南笙酒味 提交于 2020-02-26 18:43:41
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。 代码 回溯法,即暴力求解的升级版。回溯法非常适合多个步骤组成的问题,每个步骤有多个选项。且回溯适合用递归来写。 public class Solution { //输入的虽然是个数组,但可以根据后面的rows和cols参数来确定出一个矩阵 public boolean hasPath(char[] matrix, int rows, int cols, char[] str) { int flag[]=new int[matrix.length]; for(int i=0;i<rows;i++){ for(int j=0;j<cols;j++){ if(backtrack(matrix,rows,cols,i,j,str,0,flag)){ return true; } } } return false; } public boolean backtrack(char[]

通俗易懂的理解卷积

余生长醉 提交于 2020-02-26 14:54:58
教科书上一般定义函数 ​的卷积如下: 连续形式: ​​离散形式:​ 并且也解释了,先对g函数进行翻转,相当于在数轴上把g函数从右边褶到左边去,也就是卷积的“卷”的由来。 然后再把g函数平移到n,在这个位置对两个函数的对应点相乘,然后相加,这个过程是卷积的“积”的过程。 这篇文章主要想解释两个问题: 卷积这个名词是怎么解释?“卷”是什么意思?“积”又是什么意思? 卷积背后的意义是什么,该如何解释? ## 考虑的应用场景 为了更好地理解这些问题,我们先给出两个典型的应用场景: 信号分析 一个输入信号f(t),经过一个线性系统(其特征可以用单位冲击响应函数g(t)描述)以后,输出信号应该是什么?实际上通过卷积运算就可以得到输出信号。 图像处理 输入一幅图像f(x,y),经过特定设计的卷积核g(x,y)进行卷积处理以后,输出图像将会得到模糊,边缘强化等各种效果。 对卷积的理解 对卷积这个名词的理解: 所谓两个函数的卷积,本质上就是先将一个函数翻转,然后进行滑动叠加。 在连续情况下,叠加指的是对两个函数的乘积求积分,在离散情况下就是加权求和,为简单起见就统一称为叠加。 整体看来是这么个过程: 翻转——>滑动——>叠加——>滑动——>叠加——>滑动——>叠加…多次滑动得到的一系列叠加值,构成了卷积函数。 卷积的“卷”,指的的函数的翻转,从 g(t) 变成 g(-t) 的这个过程;同时,“卷

差分——(2)二维差分

倾然丶 夕夏残阳落幕 提交于 2020-02-26 09:10:45
前面部分我们介绍了一维差分, https://blog.csdn.net/justidle/article/details/103761632 。下面我们扩展一下,来介绍二维差分。 什么是二维差分 我们有一个矩阵,如下图所示。 根据二维前缀和表示的是右上角矩形的和,由于差分只涉及前面相邻的数(由一维可以推出),并且由前面范围的数相加得到这个位置的数。那么类比二维前缀和和一维差分,可以简单推测出二维差分的公式 如何从差分矩阵得到原矩阵呢?可以参考下面公式 举例 比如,我们有一个矩阵 a,如下所示: 1 2 4 3 5 1 2 4 6 3 5 9 那么对应的二维差分矩阵 p 如下: 1 1 2 -1 4 -5 -1 3 1 1 1 2 应用  如果我们要在左上角是 (x1,y1),右下角是 (x2,y2) 的矩形区间每个值都 +a,如下图所示 在我们要的区间开始位置(x1,y1)处 +c,根据前缀和的性质,那么它影响的就是整个黄色部分,多影响了两个蓝色部分,所以在两个蓝色部分 -c 消除 +c 的影响,而两个蓝色部分重叠的绿色部分多了个 -c 的影响,所以绿色部分 +c 消除影响。所以对应的计算方法如下: diff[x1][y1] += c; diff[x1][y2+1] -=c; diff[x2+1][y1] -=c; diff[x2+1][y2+1] += c; 模板题 链接

稀疏数组(sparsearray)

不羁岁月 提交于 2020-02-26 03:13:06
稀疏数组(sparsearray) 先看一个实际的需求 编写的五子棋程序中,有存盘退出和续上盘的功能。 分析问题: 因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据.->稀疏数组。 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: 记录数组一共有几行几列,有多少个不同的值 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模 稀疏数组举例说明 稀疏数组第一行值:显示原二维数组有几行几列几个有效值! 接下来开始挨个记录有效值所在行列值! 二维数组和稀疏数组的相互转换 例:如图 二维数组转稀疏数组的思路: 遍历原始二维数组,得到有效数据的个数 sum 根据sum就可以创建稀疏数组 sparseArr int[sum+1][3] 将二维数组的有效数据存入到稀疏数组中 稀疏数组转二维数组的思路: 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int[11][11] 再读取稀疏数组后几行的数据,并赋给原始的二维数组即可! 代码实现: package com . atguigu . sparsearray ; public class SparseArray { public static void main ( String [ ]

层次分析法

萝らか妹 提交于 2020-02-26 00:14:48
title: 层次分析法 date: 2020-02-25 19:14:41 categories: 数学建模 tags: [MATLAB, 评价模型] mathjax: true 定义 ​ 层次分析法(The Analytic Hierarchy Process即AHP)是由美国运筹学家、 匹兹堡大学教授T . L. Saaty于20世纪70年代创立的一种系统分析与决策的综合 评价方法,是在充分研究了人类思维过程的基础上提出来的,它较合理地解 决了定性问题定量化的处理过程。 ​ AHP的主要特点是通过建立递阶层次结构,把人类的判断转化到若干因 素两两之间重要度的比较上,从而把难于量化的定性判断转化为可操作的重 要度的比较上面。在许多情况下,决策者可以直接使用AHP进行决策,极大 地提高了决策的有效性、可靠性和可行性,但其本质是一种思维方式,它把 复杂问题分解成多个组成因素,又将这些因素按支配关系分别形成递阶层次 结构,通过两两比较的方法确定决策方案相对重要度的总排序。整个过程体 现了人类决策思维的基本特征,即分解、判断、综合,克服了其他方法回避 决策者主观判断的缺点。 步骤 第一步递阶层次结构 分析系统中各因素之间的关系,建立系统的递阶层次结构。 第二步构造判断矩阵 {1,2,3,...,9}:代表重要程度,逐渐递增 得到一个方阵,我们记为A,对应的元素为 \(a_{ij}\)

图(一)-数据结构学习笔记

a 夏天 提交于 2020-02-25 23:48:56
文章目录 1. 图简介 1.1 图的分类 1.2 图的描述 1.2.1 边的描述 1.2.2 路径(path)/环路(circle) 路径描述 路径分类 2. 如何使用代码描述图 2.1 邻接矩阵(adjacency matrix)和关联矩阵() 2.1.1 邻接矩阵 2.1.2 关联矩阵(incidence matrix) 1. 图简介 1.1 图的分类 图分为 有向图 (digraph): 即所有边皆有向的图 无向图 (undigraph): 即所有边皆无向的图 混合图(mixed graph): 即含有无向以及有向边的图 虽然图分为上面三种, 但是我们重点分析有向图, 因为所有的图都可以由有向图简化得到 1.2 图的描述 基于任意一个图都可以由点集V 与边集 E组成 , 我们可以对图 G 做出如下描述 G = ( V ; E ) G = (V;E) G = ( V ; E ) V(vertex): V 代表图的点集, 我们令 n = ∣ V ∣ n = |V| n = ∣ V ∣ ,n代表顶点的个数 E(edge): E 代表图的边集, 我们令 e = ∣ E ∣ e = |E| e = ∣ E ∣ , e代表边的个数 1.2.1 边的描述 我们使用 ( u , v ) (u,v) ( u , v ) 来描述一条边 若u,v的次序无所谓, 则称为 无向边(undirected

jquery ajax向后端传二维数组

余生颓废 提交于 2020-02-25 23:31:28
当设置数据格式为json时,Jquery ajax只能传递json对象到后端进行数据交换。 当使用ajax传递二维数组到后端时,要讲其转换为json。 var selectProduct; //一个二维数组 var newSelectProduct = { }; // 定义一个空对象 for (var i = 0; i < selectProduct.length; i ++) { // 遍历二维数组中的每一个成员 newSelectProduct[i] = { }; newSelectProduct[i][‘id’] = selectProduct[i][‘id’]; newSelectProduct[i][‘num’] = selectProduct[i][‘num’]; } console.log(newSelectProduct); // 二维对象 newSelectProduct = JSON.stringify(newSelectProduct); console.log(newSelectProduct); // json 对象 {“0”:{“id”:“2”,“num”:7},“1”:{“id”:“1”,“num”:42}} 这样就可以通过ajax将数据传给后端了 4。 后端接收到的是是json字符串, ‘{“0”:{“id”:“1”,“num”:42},“1”:{

Java实现 稀疏矩阵乘积

爷,独闯天下 提交于 2020-02-25 20:06:56
稀疏矩阵乘积 描述 给定两个N × N的稀疏矩阵A和B,其中矩阵A有P个元素非0,矩阵B有Q个元素非0。请计算两个矩阵的乘积C = A × B并且输出C中所有非0的元素。 输入 第一行包含三个整数N, P, Q 以下P行每行三个整数i, j, k表示A矩阵的一个非0元素:Aij = k 以下Q行每行三个整数i, j, k表示B矩阵的一个非0元素:Bij = k 对于80%的数据,1 ≤ N, P, Q ≤ 200 对于100%的数据, 1 ≤ N, P, Q ≤ 2000, 1 ≤ i, j ≤ N, 0 ≤ k ≤ 100 输出 输出若干行,按先行后列的顺序输出矩阵C的每一个非0元素 每行三个整数i, j, k表示C矩阵的一个非0元素:Cij = k package 第二次模拟; import java.util.Scanner; public class Demo4矩阵相乘 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int p = sc.nextInt(); int q=sc.nextInt(); int [] [] a = new int [p][3]; int [] [] b = new int [q][3];

Numpy基础

可紊 提交于 2020-02-25 19:56:54
一、numpy的属性 import numpy as np 此语法导入了numpy库,并且给numpy起了一个别称np用来方便以后的使用。 下面定义一个矩阵: array = np . array ( [ [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] ] ] ) print ( array ) 执行: print ( array . ndim ) 可以查询到矩阵,输出结果为3。还有一些操作如下: print ( array . shape ) #输出矩阵形状 print ( array . size ) #输出矩阵大小 print ( array . dtype ) #显示矩阵的元素类型 二、创建array import numpy as np a = np . array ( [ 1 , 2 , 3 ] , dtype = np . int32 ) #创建一个内容为1,2,3,数据类型为整形32位的数组 print ( a . dtype ) 创建一个二维矩阵,注意中括号数目: d = np . array ( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] ) #创建一个二维矩阵 print ( d ) 生成一个2行3列的零矩阵: zero = np . zeros ( ( 2 , 3 ) ) print (