自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

原创 博客从CSDN迁移至简书啦

简书新博客地址:http://www.jianshu.com/u/5e702f7512fa。以后基本都在简书平台上更新博客啦。

2017-12-16 17:53:37 1895

原创 java虚拟机理解(二)——对象访问机制

接着说java虚拟机,对象创建结束后需要使用对象,就涉及到对对象访问的问题。虚拟机的取指指针在栈上获取对象引用后,就需要到堆上去获取对象实例。对象访问取决于虚拟机实现。主流的java虚拟机采用直接指针的形式进行对象访问。直接地址的对象访问       直接地址访问速度快,栈上的reference引用直接获取堆上的对象实例数据,同时通过堆上到方法区上对象类型数据的指针找到对象类型数据。以下是直接指针访

2017-03-22 19:52:45 844

原创 java虚拟机理解(一)——内存模型与对象创建

JVM是java语言一项重要产物,正是由于JVM的存在,才使得java语言的跨平台特性。闲话少说,先来总结一下java虚拟机的内存模型。1) 再说java内存模型      运行时数据区域通常分为:方法区和堆以及虚拟机栈、本地方法栈、程序计数器。以上几个部分构成运行时数据区。先来看看各部分负责的功能。程序计数器:这个比较好懂,就是PC指针。当前线程所执行代码的行号指示器,通过计数器来取下一条需要执行

2017-03-21 13:53:24 762

原创 Android Handler消息传递机制与工作原理

在Android中对UI组件属性的修改的常见的动作。Android程序启动之后会创建一个Main线程,也就是UI线程。当创建新的线程时就可能在Activity中修改UI组件的属性,但是这个过程并不是安全的,因为一般情况下只允许UI线程才能修改Activity里面的组件属性。这里就有一个问题了:线程对UI组件的属性修改是一件不安全的事情。如何解决其他线程对Activity中的UI组件属性进行修改呢?答

2017-03-19 22:25:39 824

原创 java实现上位机与下位机串口通信

串口通信是在工程应用中很常见。在上位机与下位机通讯过程中常通过有线的串口进行通信,在低速传输模式下串口通信得到广泛使用。在说个之前先来简单解释一下上位机与下位机的概念。上位机与下位机通常上位机指的是PC,下位机指的是单片机或者带微处理器的系统。下位机一般是将模拟信号经过AD采集将模拟量转换为数字量,下位机再经过数字信号处理以后将数字信号通过串口发送到上位机,相反上位机可以给下位机发送一些指令或者信息

2016-12-24 23:38:21 55303 70

原创 CSDN编辑器markdown字体、颜色与字号的设置

markdown是一种可以使用普通文本编辑器编写的标记语言,通过标记特殊语法生成具有一定格式的内容。在csdn上也写过几篇文章,对于markdown的使用可以说是仅仅使用了这里面最最基本的功能,接触最多的就是输入文字,插入图片以及插入代码。涉及到表格更多的时候就使用外部编辑器进行操作完成后再插入到markdown里面来,虽然很low却很快。还有对于颜色字体以及大小的控制,这次主要总结markdown

2016-12-18 23:25:22 8724 4

原创 在较大数据集中使用java文件处理技术获取目标数据

实验中可能会接触到各种大小的数据库,随着机器学习和深度学习的广泛使用,实验中使用的数据库也越来越大。但是有些原始的开源数据库并不一定适合实验条件,因此需要对数据进行预处理。对于规模达到一定程度的数据库,如何进行处理是一件不好弄的事情。 由于最近在实验中需要对数据集进行预处理,数据集数据量较大,考虑到人工进行数据包的截取比较费力费时,就写了一个数据处理的小工具,处理的核心是对文件的操作,接下来就简单说

2016-12-18 21:39:49 1296

原创 git在本地仓库上的使用

git作为一款优秀的版本控制工具受到广大用户的欢迎和喜爱,不管是开发还是项目管理都发挥着重要的作用。前面一篇文章已经简要说了如何在github上注册以及在本地添加SSH秘钥操作,包括在本地通过git指令将需要上传的开源文件传到远程仓库里面去。http://blog.csdn.net/cai2016/article/details/51557682      但有时候仅仅想在本地进行操作,将仓库建立在

2016-12-16 16:02:15 8677

原创 matlab文件与子文件操作

matlab是算法仿真比较流行的工具,在做各种算法仿真的时候需要对数据的处理,有时候包括对数据的读取以及存储等常见操作。下面就来简单说说matlab处理文件和子文件的一些相关操作。      在各种语言里面都有对文件流的操作,matlab也提供了一些文件操作API,这些API给用户带来了很大的便利。虽然matlab里面对于文件进行处理(比如说常见的load、importdata等操作)是一件很简单的

2016-11-27 20:40:34 2451

原创 基于自回归模型(AR)的自适应阈值的残差比异常检测

接着说变点检测,变点检测有很多的检测方法,今天介绍一种基于残差比异常检测算法。残差       残差是指在实际观察值与估计值(拟合值)之间差值。说到残差就先提提回归分析。回归是指研究一组随机变量(自变量)(Y1 ,Y2 ,…,Yi)和另一组(X1,X2,…,Xk)因变量之间关系的统计分析方法。这里介绍一种回归模型—自回归(AR)自回归模型(AR)       对于时间序列离散信号X(n),可以根据历

2016-11-23 19:59:29 5009 1

原创 CUSUM算法在变点检测中的应用

变点检测在很多场合都有使用,例如在机器故障的检测以及各种信号突变的监测等等。变点检测一般就是根据信号序列的统计特性发生改变进行判定,常用的统计特征包括前期数据的均值和方差、残差等。很明显当信号序列发生突变时会改变一些统计特征,比较直观的就是均值和方差会进行改变,最简单的方式是我们可以根据这种改变进行合理设置阈值,超过设定的阈值时就可以判定突变发生。CUSUM控制图简介       CUSUM是一种时

2016-11-22 19:29:55 28087 5

原创 EEMD/EMD经验模态分解算法在单通道转多通道过程的使用

最近在探索盲源分离技术过程中遇到单通道向多通道转换问题,由于ICA盲源分离使用的多通道观测点的信号,如何使单通道信号得到多通道信号是一个技术难点。单通道转多通道技术(SIMO)相对应的通领域技术多输入多输出的问题(MIMO),单输入多输出在实际场所比较多,不仅包括军事方面,雷达信号等,还包括其他场合。      前面介绍过ICA算法在信号盲源分离过程中的使用,有时候得到的信号却是单通道的,或者说由于

2016-11-21 19:00:44 10293 8

原创 S变换在特征提取中的使用

S变换      S变换采用高斯窗函数且窗宽与频率的倒数成正比,免去了窗函数的选择和改善了窗宽固定的缺陷,并且时频表示中各频率分量的相位谱与原始信号保持直接的联系,S变换具有良好的时频特性,适合用S变换对信号的一些时频与特征进行提取。      可以看出S变换不同于短时傅里叶变换之处在于高斯窗的高度和宽度随频率变化,这样就克服了短时傅里叶变化窗口高度和宽度固定的缺陷。S变化的离散变现形式:S变换的结

2016-10-31 21:19:58 28285 25

原创 ICA(独立成分分析)在信号盲源分离中的应用

ICA简介      ICA是20世纪90年代提出的,起初是神经网络的研究中有一个重要的问题,独立成分分析是一个解决问题的新方法。在许多应用方面,包括特征识别、信号分离。这种方法是用一种解线性方程组的方式的估计方式求解信号源。ICA与鸡尾酒会      假想一下,在一个房间里的不同位置放着两个麦克风,同时有两个人说话。两个麦克风能同时记录下两个时间信号,如果仅用这两个记录的信号来估计出原来的两个语音

2016-10-31 20:11:15 40277 18

原创 小波变换在信号去噪声中的使用

关于小波变换      小波变换(wavelet transform,WT)是一种新的变换分析方法,能够在时间(空间)频率的局部化分析,通过伸缩平移运算对信号(函数)逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求。去噪的必要性       一般来说信号中都是带有信号的,特别是信号的采集过程中,在接收端除了获取目标信号外还会引入噪声。常见的噪声包括高斯白噪声,

2016-10-31 16:07:12 71262 18

原创 哈希表之开放地址的三种方法

hash表作为一种常见数据结构可以提供快速的插入和查找操作,不管哈希表中有多少个数据,插入和删除数据只需要接近O(1)的时间。这是具有非常大的优势。通常使用hash表速度会比树快,因为树需要O(N)时间级。不过hash表是基于数组的,创建后比较难扩展,使用不灵活。这样就注定需要面对动态内存问题,通常的思路是对数组进行扩展,将之前的数据复制到新的数组中并释放原来的内存。      hash表就是key

2016-10-03 20:23:10 22021

原创 二叉树遍历与删除

前面写过二叉树的节点插入与查找关键数据项以及最值的数据项。二叉树的删除与遍历是另外一项重要的操作。特别是二叉树的人删除比较复杂,分为无子节点的节点删除,只有一个子节点的节点删除和有两个子节点的节点删除三种情况。1. 删除没有子节点的节点      这种情况是三种节点删除中最简单的。因为没有子节点的节点删除时只需要将该节点的左或者右节点的引用置为null即可。其他的基本不用变。可以下图表示:原始二叉树

2016-09-20 23:18:31 9056 1

原创 二叉树

二叉树的优势       在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择。有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除。但是在有序数组中插入数据就会很慢,同样在链表中查找数据项效率就很低。综合以上情况,二叉树可以利用链表和有序数组的优势,同时可以合并有序数组和链表的优势,二叉树也是一种常用的数据结构。二叉树的构成      二叉树由节点(node)和边组成。节点

2016-09-19 23:09:36 51119 10

原创 基数排序

基数排序是一种与之前几种排序不同的排序方法,之前的排序是基于关键字排序算法。基数排序属于分配式排序,而且基数排序是稳定排序。以下是基数排序的步骤:假设在一个数组为例,数据中的数据项均小于1000(位数最多是三维)。1 先对数组中所有的数据项个位进行排序,个位数字0~9,从小到大的顺序进行存放(不比较其他位数字大小),结果存放在一个缓存二维数组里面。2 在步骤1的基础之上继续对数据项的十位进行排序(数

2016-09-17 19:18:36 681

原创 快速排序

快速排序是一种常见的排序算法,大多数情况下快速排序都是最快的。快速排序本质上是将一个数组划分一个子数组(关于划分前面已经说过),递归调用自身为每一个子数组进行快速排序。       快速排序的过程:以数组为例,针对数组进行排序。1 把数组或者子数组划分为左边(比关键字小的)一组和右边比关键字大的一组。2 调用自身对左边一组进行排序。3 再次调用自身对右边的一组进行排序。4 不断递归循环以上步骤,子数

2016-09-16 22:20:26 560

原创 划分

接触快速排序之前首先需要了解划分。划分就是将数据划分为两组,比关键字大的划分在一组,比关键字小的划分在另外一组。       划分算法可以理解是两个指针操作的进程。开始时指针分别指向数组头部和尾部(以数组为例,通常数组是没有头部和尾部所谓的,这里是简单描述这个问题),操作的过程是以下几个流程:1 初始化leftPtr(向右检索的指针)在数组最左端,rightPtr指针在数组最右端。2 leftPtr

2016-09-15 15:42:03 488

原创 希尔排序

前面说过插入排序,插入排序是三种基本排序中较快的一种,效率最低的是冒泡排序,因为冒泡排序需要反复比较。对于插入排序虽然较快,不过比较复制次数比较多。希尔排序是在插入排序的基础上进行改进,排序速度比插入排序要快。      希尔排序是通过缩小插入排序中的元素之间的间隔,假设是对数组进行排序,可以认为希尔排序首先将对数组进行划分子数组,对每个数组进行插入排序。子数组的划分依据是每个一定的长度h。通过缩短

2016-09-10 18:21:52 795

原创 归并排序

归并排序是一种效率较高的排序,与之前说到的三种基本排序:冒泡排序、选择排序、插入排序速度要快。归并排序核心是将归并两个有序的数组,并使它们有序的排列在数组C中。假设有两个有序数组,不要求大小长度一致,假设数组有4个数组项,数组B有6个数据项,需要将他们归并到一个数组C中,以下是归并过程。归并之后的数组C以下是将数组A和数组B归并为数组C的代码:(前提是数组A与B有序)//采用常规思维解决归并排序问题

2016-09-09 21:55:13 359

原创 求解汉诺塔问题

汉诺塔是经典问题。具体表述为:由很多放置在三个塔座上的盘子组成的一个古老难题,所有盘子直径都是不同的,盘子中央都有一个洞使他们刚好可以放在塔座上。所有的盘子刚开始放在塔座A上面,这个难题的目标是将所有的盘子都从塔座A上移动到塔座C上,每一次只能移动一个盘子,并且任何一个盘子都不可以放在比自己小的盘子之上。如下图所示:       以三个盘子为例,如果以手工进行试验需要移动7次,先后顺序是:Disk

2016-09-08 22:14:27 576

原创 递归——单词全排列

递归是编程技术中常用的一种技术,就是方法是支持自己调用自己,在面对过程编程中已经有了递归的接触,像斐波那契序列的求解等这些都是可以用递归来解决的。java方法是支持嵌套调用方法不支持嵌套定义。       使用递归需要注意以下几点:1 递归需要一个基值情况,其意思是导致递归的返回而没有再一次递归调用。2 第一个递归都需要有终止条件。以防止无限递归下去,可能由此引发程序崩溃。以上两点是在递归调用中特

2016-09-08 19:21:13 1908

原创 链表与迭代器

链表的使用中find操作是常见的,很多时候也需要对链表进行遍历。如果使用迭代器遍历每一个对象,这样就会使数据结构与遍历对象(迭代器)区分开,java中的Iterator作为轻量级对象,创建代价比较小。至少在使用迭代器可以有一下几点好处:     1 迭代器可以提供统一的迭代方式,也就是说对于链表、队列、数组、叉树都可以使用迭代器来时实现迭代。     2 迭代器可以在客户端透明的情况下提供各种不同的

2016-09-07 19:14:19 3929

原创 双向链表

前面叙述了关于单链表、双端链表、有序链表的结点插入以及遍历查找等示例。这几种链表都只能从前往后进行遍历,反向遍历是非常麻烦的一件事。       考虑一下下面这个情况:如果文本编辑器用链表来存储文本,当用户向下移动光标时,程序移动到下一个链结点操作新一行,假设链表每个结点存放的是一行字符串。光标向下移动前面所说的几种链表结构已经实现了。但是光标上移就显得复杂,至少在不使用双向链表的前提下没那么向下移

2016-09-06 21:40:21 807

原创 有序链表

链表中有时候需要对数据的顺序有所要求,对于一些应用来说链表中保持数据有序是有意义的一件事,下面就围绕有序链表,说明有序链表的创建和利用链表实现排序。      在有序链表插入一个数据项,可以采用之前的插入排序的思想,通过局部有序实现数据的排序。插入数据通常在链表中有三种方式:在链表头部、尾部、中间。这三种方式需要考虑到。有序链表的创建过程       和一般链表创建一样,首先创建一个结点node,包

2016-09-05 22:44:46 775

原创 双端链表

双端链表与传统的链表很相似,在基本链表的基础上新增一个特性:对最后一个结点的引用。如下图所示:      与之前说到的链表相比还有一个功能是在表尾直接插入一个链结点,这样就不用普通链表一样通过遍历链表到尾部进行添加数据项了。     双端链表的操作与单链表操作区别除了可以从头部插入数据和删除数据、查找数据以及实现关键数据项的删除等,还可以实现从链表尾部添加数据。以下是代码:class Link1{

2016-09-04 13:30:40 1301

原创 数据结构——单链表

链表也是一种常用的数据结构,机制灵活用途广泛,适用于许多通用数据库。讨论一下数组的使用缺陷:1.无序数组搜索效率比较低,有序数组插入效率比较低。无论哪一种删除效率都很低。2。数组大小一旦创建了就不能改变该数组的大小了。链表相对于数组这些缺陷都有一定的改善。链结点通常每个对象中都包含一个对下一个链结点的引用。如下图所示:关于自引用       在定义链表基本结构时会用到自引用,这是建立链表的重要环节。

2016-09-03 21:13:14 596

原创 优先级队列

Java实现数据结构之优先级队列。

2016-09-02 22:56:35 528

原创 java返回多参数方法与方法的多参数传递

1 java返回多参数方法      在编写程序时经常遇到从一个方法中返回多个有用信息的情况。例如查找一个数组中最大值与最小值,一般的做法是通过一个for循环,两个if判断找出最值。但是在找到有用信息后需要通过函数返回的方式获取有用信息。当然我们可以通过全局变量解决这个问题,然而在C编程里面我们最好减少全局变量的使用,在这里介绍一种用java返回对象的同时返回多个字段信息。public void g

2016-08-31 11:30:35 6518

原创 数据结构——队列的使用

队列(Quene)是一种数据结构,与栈不同的是先进先出(FIFO),最先进去的数据最先出来。主要讲解循环队列与缓冲环的使用。

2016-08-30 23:33:30 3296

原创 数据结构——栈的使用

栈的基本介绍,使用栈实现字符串反转以及匹配符匹配检测。

2016-08-30 22:28:21 454

原创 对象数组排序

对象数组排序

2016-08-30 22:19:43 687

原创 简单排序:冒泡排序、选择排序、插入排序

冒泡排序、选择排序、插入排序算法分析。

2016-07-10 22:56:14 1070 1

原创 有序数组之二分查找

数据结构与算法是程序深入设计需要理解的知识。关于数据结构和算法就从最简单的部分开始了。来看第一个问题:数组的二分查找。      数组是我们常见的数据结构,在程序设计中应用广泛。关于数组的操作通常是:查找、插入、删除。二分查找是我们常用的一种查找方式,效率比较高。提到二分查找,最原始的方式是线性查找。线性查找就是直接在有序数组的基础上直接从左向右方向进行查找,当在数组中找到一个比一个待查数据大时就退

2016-07-10 21:20:15 4295

原创 初步认识linux与入门

习惯了使用windows以后接触另外一个操作系统似乎不太习惯,考虑到linux众多优越性,首先就说说为什么学习linux。在接触linux之前先来说说我对linux的理解。1. linux完全开源,免费。      如果你问我当前使用最广的操作系统是啥?肯定绝大多数人会说是windows,没错。微软旗下的windows系列广为流行,而且都是具备图形化界面,用户起来也很方便。但是windows系统是收

2016-07-10 18:27:47 4605 2

原创 java自动装拆箱、Random类、Arrays类常用方法

自动装箱与拆箱概念。装箱通俗易懂说就是把基础类型封装成一个类。比如把int封装成Integer,这时你就不能把他当成一个数了,而是一个类了,对他的操作就需要用它的方法了。拆箱就是把类转换成基础类型。比如你算个加法什么的是不能用类的,就得把它转换成基本类型。首先来看一个demo:Integer data1 = new Integer(10);

2016-07-01 22:40:28 689

原创 java内存管理与垃圾回收

java内存管理是非常重要的部分。在java开发过程中不可避免设计内存管理和垃圾回收问题,只不过java这方面处理比较好,不需要用户过多的担心内存泄漏以及垃圾回收问题。但是还是简要明白其中的原理更有利于深入使用java。     Java是在JVM所虚拟出的内存环境中运行的。内存分为栈(stack)和堆(heap)两部分。先来简要看看java虚拟机:Java虚拟机有自己完善的硬体架构,如处理器、堆栈

2016-07-01 14:44:00 473 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除