K-SVD的基本介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K-SVD的基本介绍相关的知识,希望对你有一定的参考价值。

参考技术A

K-SVD算法 是2006年由以色列理工学院的Michal Aharon、Michael Elad等人提出来,是一种非常经典的字典训练算法,并且达到了很好的训练效果。其目的是解决下列矩阵等式的解:

其中是要训练的字典,是要训练的、对应字典的稀疏系数矩阵。当矩阵的维数很高时,即使使用计算机软件(如matlab)也很难求解矩阵方程,而该算法正是解决了高维矩阵求解的问题。

基本类型介绍

基本类型介绍

JAVA 中标识符的命名原则

  • 可以使用 " _ ", " $ " 开头,其他字符一律不行;
  • 不可以使用数字作为开头;
  • JAVA 使用Unicode字符集,所以可以使用汉字来命名;但是我们人为不允许。

变量类型

1.常用变量的大小 (1 Bytes = 8 bits)

  • double: 8 Bytes
  • long: 8 Bytes
  • int: 4 Bytes

2.分类

局部变量

  • 方法或语句块内部定义的变量。
  • 生命周期从生命位置开始到方法或语句块执行完毕为止。语句块是用 {} 包含起来的代码块。

成员变量

  • 方法外部、类的内部定义的变量
  • 生命周期伴随对象始终。
  • 如果不自行初始化,就按照规则自动初始化。如:
    • int -- 0;
    • double -- 0.0
    • char -- ‘u0000‘
    • boolean -- ‘false‘

静态变量

  • 使用 static 定义。又称 类变量 (static variable)
  • 从属于类,生命周期伴随类的始终--从类加载到卸载;
  • 定义类变量是在整个类中定义的,即:在主函数外部定义,这样在同一个类中其他函数也可以使用这个变量;
  • 格式:public static final int STATICVARS = 4;

常量(constant)

  • 一旦初始化就不能再改变;习惯上,常量名使用全大写
  • 我们主要是用关键字 final 来定义常量;
  • const 是java的保留关键字,目前并没有被使用;
  • 如果一个常量声明为public,那么其他类方法也可以使用这个常量;
  • 常量分为字面常量和符号常量
    • 字面常量: 1, 2, 3, ‘a‘, true, "HelloWorld"
    • 符号常量: 使用 final 修饰的;

数据类型

数据类型分为基本数据类型引用数据类型

基本数据类型

  • 数值型
  • 浮点型
  • 字符型
  • 布尔型

引用数据类型 (4B)

  • 类(class)
  • 接口(interface)
  • 数组

数值型

也就是 整型

  • 数据大小
    • byte : 1B
    • short: 2B
    • int : 4B
    • long : 8B
  • 表示其他进制数
    • 十进制整数;如: 99, -15
    • 八进制整数;要求以 0 开头;如:015
    • 十六进制;要求以 0x 或 0X 开头。如:0x15
    • 二进制数;要求以0b0B开头。如:0b01110101

浮点型

  • 数据大小
    • float : 4B 单精度,尾数精确到7位有效数字
    • double: 8B 双精度,精度是 float 的两倍
  • 科学计数法
    • 314e2: 314 x 10^2 = 31400
    • 314e-2: 314 x 10^(-2) = 3.14
    • 以此类推即可

字符型 char : 2B

char 型使用的是 unicode 字符集

  • 表示方法
    • 单引号法:如:char a = ‘A‘
    • 十六进制数值表示方法:如:char a = ‘u0061‘ 代表字符 a ;
    • 使用 u0000 -> uffff 来表示除了 unicode 之外的编码;如 u2122 表示注册符号 ? ; u01C0 表示 π;
  • char 型字符和值的互相转换
    • 这也就意味着 char 型数据也可以用于数值比较;
char a = ‘a‘;
System.out.println(a);
// 两种类型转换的方法            System.out.println(0+a);            System.out.println((int)a);

// 输出
a
97
97
  • 转义字符
转义字符 含义 unicode值
 退格 u0008
换行 u000a
回车 u000d
制表符 u0009
" 双引号 u0022
单引号 u0027
反斜杠 u005c
  • 字符类型转化
System.out.println(‘a‘ + ‘b‘)
System.out.println("" + ‘a‘ + ‘b‘);

// 返回
195
ab

布尔型(boolean) (1bit)

只有两个值:true false; 写代码时以下写法要注意:

boolean flag = true;
if (flag == true) {   //我们不使用这种写法
    System.out.println("true");
}

//标准写法
if (flag) {
    System.out.println("true");
    }

注意:

  1. 定义 long 型数据,需要在后面加 " L " 或 " l " 表示为 Long 型常量

这是因为 java 语言中的整形常数默认为 int 型,所以声明 long 型常量在后面加上 " L ";

如:long temp = 9876543210L; 这个数据显然超过了 int 型的范围(约21亿),这是就需要加上 " L ",否则会出现编译错误;

  1. 定义 float 型数据,需要在后面加 " F " 或 " f " 表示为 float 型常量

这是因为 java 语言中的浮点形常数默认为 double 型,所以声明 double 型常量在后面加上 " F ";

如:float temp = 3.14F; 如果没有这个 F 就会出现编译错误。

  1. 浮点型数据不能用于比较!

浮点数不适合在不允许舍入误差的金融计算领域;

如果需要进行不产生摄入误差的精确数字计算,需要使用 java.math类下的 BigDecimalBigInteger

BigInteger 实现了任意精度的整数运算;

BigDecimal 实现了任意精度的浮点运算。

  1. 使用 Double.isNaN(x) 来检查 x 是否为数值;
import java.math.BigDecimal;
/**
    * 浮点数的相关操作
    * Author: Eric Pan
    * Date: 2019.7.18
*/
public class DataType {
    /**
    * 浮点数是不能用于比较的;
    * 每次得到的结果可能不同;
    */
    public static void floatCharacter() {
        float d1 = 0.1f;
        double d2 = 1.0/10;
        float d3 = 423432423f;
        float d4 = d1 + 1;
        
        System.out.printf("d1和d2的比较结果是 %s
", d1 == d2);
        System.out.printf("d3和d4的比较结果是 %s
", d3 == d4);
    }
    
    /**
    * 使用 BigDecimal 来比较浮点数
    */
    public static void floatComparison() {
        BigDecimal bdDecimal = BigDecimal.valueOf(1.0);
        
        // 使用 BigDecimal 方法减5次0.1;
        for (int i=0; i<5; i++)
            bdDecimal = bdDecimal.subtract(BigDecimal.valueOf(0.1));
    
        System.out.println(bdDecimal);
        System.out.println(1.0-0.1-0.1-0.1-0.1-0.1);
    
        // 比较要使用 .equals() 方法
        BigDecimal bd1 = BigDecimal.valueOf(0.1);
        BigDecimal bd2 = BigDecimal.valueOf(1.0/10);
        System.out.println(bd1.equals(bd2));
    }
    
    public static void main (String[] args) {
        floatCharacter();
        floatComparison();
    }
}
    
// 返回
d1和d2的比较结果是 false
d3和d4的比较结果是 false
0.5
0.5000000000000001
true

以上是关于K-SVD的基本介绍的主要内容,如果未能解决你的问题,请参考以下文章

如何对k-svd初始化字典进行改进

关于MATLAB中稀疏表示的K-SVD算法的疑问,跪求各位大神指点,感激不尽,详细内容见问题补充

K-SVD字典学习及其实现(Python)

视频编码技术---压缩感知编码---匹配跟踪算法

IEEE Trans 2006 使用K-SVD构造超完备字典以进行稀疏表示(稀疏分解)

What is K-SVD?