K-SVD的基本介绍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K-SVD的基本介绍相关的知识,希望对你有一定的参考价值。
参考技术AK-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
- 二进制数;要求以
0b
或0B
开头。如: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");
}
注意:
- 定义 long 型数据,需要在后面加 " L " 或 " l " 表示为 Long 型常量。
这是因为 java 语言中的整形常数默认为 int 型,所以声明 long 型常量在后面加上 " L ";
如:long temp = 9876543210L
; 这个数据显然超过了 int 型的范围(约21亿),这是就需要加上 " L ",否则会出现编译错误;
- 定义 float 型数据,需要在后面加 " F " 或 " f " 表示为 float 型常量。
这是因为 java 语言中的浮点形常数默认为 double 型,所以声明 double 型常量在后面加上 " F ";
如:float temp = 3.14F
; 如果没有这个 F
就会出现编译错误。
- 浮点型数据不能用于比较!
浮点数不适合在不允许舍入误差的金融计算领域;
如果需要进行不产生摄入误差的精确数字计算,需要使用 java.math
类下的 BigDecimal
或 BigInteger
。
BigInteger
实现了任意精度的整数运算;
BigDecimal
实现了任意精度的浮点运算。
- 使用
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的基本介绍的主要内容,如果未能解决你的问题,请参考以下文章
关于MATLAB中稀疏表示的K-SVD算法的疑问,跪求各位大神指点,感激不尽,详细内容见问题补充