稀疏表示的性质
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了稀疏表示的性质相关的知识,希望对你有一定的参考价值。
参考技术A信号稀疏表示的目的就是在给定的超完备字典中用尽可能少的原子来表示信号,可以获得信号更为简洁的表示方式,从而使我们更容易地获取信号中所蕴含的信息,更方便进一步对信号进行加工处理,如压缩、编码等。信号稀疏表示方向的研究热点主要集中在稀疏分解算法、超完备原子字典、和稀疏表示的应用等方面。
在稀疏表示理论未提出前,正交字典和双正交字典因为其数学模型简单而被广泛的应用,然而他们有一个明显的缺点就是自适应能力差,不能灵活全面地表示信号,1993年,Mallat基于小波分析提出了信号可以用一个超完备字典进行表示,从而开启了稀疏表示的先河,经研究发现,信号经稀疏表示后,越稀疏则信号重建后的精度就越高,而且稀疏表示可以根据信号的自身特点自适应的选择合适的超完备字典。对信号稀疏表示的目的就是寻找一个自适应字典使得信号的表达最稀疏。
稀疏分解算法首先是由Mallat提出的,也就是众所周知的匹配追踪算法(Matching Pursuit,MP)算法,该算法是一个迭代算法,简单且易于实现,因此得到了广泛的应用。随后,Pati等人基于MP算法,提出了正交匹配追踪算法(Orthogonal Matching Pursuit,OMP),OMP算法相较于MP算法,收敛速度更快。在以后的研究中,为了改进OMP算法,学者也提出了各种不同的其它算法,例如:压缩采样匹配追踪(Conpressive Sampling Matching Pursuit,CoSaMP)算法、正则化正交匹配追踪(Regularized Orthogonal Matching Pursuit,ROMP)算法、分段式正交匹配追踪(Stagewise OMP,StOMP)算法、子空间追踪(Subspace Pursuit,SP)算法等等。
信号稀疏表示的两大主要任务就是字典的生成和信号的稀疏分解,对于字典的选择,一般有分析字典和学习字典两大类。常用的分析字典有小波字典、超完备DCT字典和曲波字典等,用分析字典进行信号的稀疏表示时,虽然简单易实现,但信号的表达形式单一且不具备自适应性;反之,学习字典的自适应能力强,能够更好的适应不同的图像数据,在目前的研究中,常用的学习字典的方法包括:Engan于1999年提出的最优方向(Method Of Optimal Directions,MOD)算法,该算法是学习字典的鼻祖,它的字典更新方式简单,但与此同时,它的收敛速度很慢,在该算法的基础上,一些研究人员同时还提出了一些其它的字典学习算法,如FOCUSS字典学习算法,广义PCA(Generalized PCA)算法等等,Micheal Elad也于2006年提出了基于超完备字典稀疏分解的K-SVD算法,该算法相较于MOD算法,收敛速度有了很大的提高,但是随着噪声的逐渐加大,使用该算法进行去噪后的图像因纹理细节的丢失会产生模糊的效果。Mairal于2010年提出了一种online字典学习算法,该算法速度较快且适用于一些特殊的信号处理,例如视频信号,语音信号等等 。
数组和稀疏矩阵
数组
数组的基本概念
从逻辑结构上看,一维数组A是n(n>1)个相同类型数据 元素a1、a2、…、an构成的有限序列,其逻辑表示为:A=(a1,a2,…,an)其中,ai(1≤i≤n)表示数组A的第i个元素。
数组的存储结构
将数组的所有元素存储在一块地址连续的内存单元中,这是一种顺序存储结构;
几乎所有的计算机语言都支持数组类型,以C/C++语言为例, 其中数组数据类型具有以下性质
1. 数组中的元素数目固定
2. 数组中的所有数组元素具有相同的数据类型
3. 数组中的每个元素都有一组唯一的下标
4. 数组是一种随机存储结构,可随机存取数组中的任意数据元素
LOC(ai)=LOC(a1)+(i-1)*k (0≤i≤n)
对于一个m行n列的二维数组A(m×n) 存储方式有
- 以行序为主序的存储
- 以列序为主序的存储
特殊矩阵的压缩存储
特殊矩阵主要形式有
- 对称矩阵
- 上三角矩阵/下三角矩阵
- 对角矩阵
但是它们都是方阵,即行数和列数相等
1.对称矩阵的压缩存储
??????若一个n阶方阵A[n][n]中的元素满ai,j=aj,i(0≤i,j≤n-1),则称其为n阶对称矩阵
2.三角矩阵的压缩存储
3.对角矩阵的压缩存储
稀疏矩阵
一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t十分小时,即s<<t,该矩阵成为稀疏矩阵
1. 稀疏矩阵的三元组表示方法
稀疏矩阵中的每一个非零元素需由一个三元组:(i ,j ,ai,j)唯一确定,稀疏矩阵中的所有非零元素构成三元组线性表。
#include "stdio.h"
#include <corecrt_malloc.h>
#define MaxSize 100 //矩阵中非零元素的最大个数
constexpr auto M = 6;
constexpr auto N = 7;
//存放一个非零元素
typedef struct TupNode {
int r; //行号
int c; //列号
int d; //元素值
}TupNode, * pTupNode; //三元组定义(1,2,a12) (2,3,a23)
//存放整个稀疏矩阵
typedef struct TSMatrix {
int rows; //行数值
int cols; //列数值
int nums; //非零元素个数
TupNode data[MaxSize]; //三元组
}TSMatrix, * pTSMatrix; //三元组顺序表定义
//先创建三元组
void Create(pTSMatrix t, int arr[M][N]) {
int i, j;
t->rows = M;
t->cols = N;
t->nums = 0;
for (i = 0; i < t->rows; i++) {
for (j = 0; j < t->cols; j++) {
if (arr[i][j] != 0) {
t->data[t->nums].r = i;
t->data[t->nums].c = j;
t->data[t->nums].d = arr[i][j];
t->nums++;
}
}
}
}
//输出三元组
void Disp(pTSMatrix t) {
if (t->nums <= 0)
return;
for (int i = 0; i < t->nums; i++)
printf(" %d %d %d
", t->data[i].r, t->data[i].c, t->data[i].d);
}
void main() {
pTSMatrix t;
t = (pTSMatrix)malloc(sizeof(TSMatrix));
int arr[M][N] = {
{0,0,1,0,0,0,0},
{0,2,0,0,0,0,0},
{3,0,0,0,0,0,0},
{0,0,0,5,0,0,0},
{0,0,0,0,6,0,0},
{0,0,0,0,0,7,4}
};
Create(t, arr);
Disp(t);
}
输出结果为:
未完待续----
以上是关于稀疏表示的性质的主要内容,如果未能解决你的问题,请参考以下文章