简述:

变分模态分解由Konstantin Dragomiretskiy于2014年提出,可以很好抑制EMD方法的模态混叠现象(通过控制带宽来避免混叠现象)。与EMD原理不同,VMD分解方式是利用迭代搜索变分模型最优解来确定每个分解的分量中心频率及带宽,属于完全非递归模型,该模型寻找模态分量的集合及其各自的中心频率,而每个模态在解调成基带之后是平滑的,Konstantin Dragomiretskiy通过实验结果证明:对于采样和噪声方面,该方法更具有鲁棒性。

注:个人简单理解,就是把非周期信号进行频域分析,把复杂信号分解成为多个谐波信号

另一版本:

VMD(Variational mode decomposition)是一种自适应、完全非递归的模态变分和信号处理的方法。该技术具有可以确定模态分解个数的优点,其自适应性表现在根据实际情况确定所给序列的模态分解个数,随后的搜索和求解过程中可以自适应地匹配每种模态的最佳中心频率和有限带宽,并且可以实现固有模态分量(IMF)的有效分离、信号的频域划分、进而得到给定信号的有效分解成分,最终获得变分问题的最优解。它克服了EMD方法存在端点效应和模态分量混叠的问题,并且具有更坚实的数学理论基础,可以降低复杂度高和非线性强的时间序列非平稳性,分解获得包含多个不同频率尺度且相对平稳的子序列,适用于非平稳性的序列,VMD的核心思想是构建和求解变分问题。

一、首先构造变分问题

假设原始信号f被分解为k个分量,保证分解序列为具有中心频率的有限带宽的模态分量,同时各模态的估计带宽之和最小,约束条件为所有模态之和与原始信号 相等,则VMD约束变分模型如下:

其中,为各模态函数,为各模态中心频率。

公式理解:

1.

重新定义了约束条件更严格的有限带宽的本征模态函数(BIMF

定义为:

其中,相位函数为非单调递减,即,幅值,且瞬时幅值和瞬时频率相对来说变化很缓慢,也就是说,在的间隔范围内,可以看作是一个幅值为、频率为的谐波信号。

参考《信号与系统》周期信号表示方法 ,清华大学的红色的书,图书馆里一般会              P64

2.

希尔伯特变换下的——解析信号

参考CSDN博客链接整理:希尔伯特变换(Hilbert Transform)简介及其物理意义_江户川柯壮的博客-CSDN博客_hilbert

希尔伯特变换简介_zd0303的博客-CSDN博客_希尔伯特变换

希尔伯特变换:

上面的Hilbert变换的表达式实际上就是将原始信号和一个信号做卷积的结果。这个用来卷积的信号就是:

因此,Hilbert变换可以看成是将原始信号通过一个滤波器,或者一个系统,这个系统的冲击响应为h(t)。

其傅里叶变换为为符号函数,。该式说明Hilbert变换可视为一个全通滤波器,且幅频特性为1。

卷积定理可知,的频域表达式为,进一步推导可得。从频谱上来看,这个滤波器将我们的原始信号的正频率部分乘以-j,也就是说,保持幅度不变的条件下,将相位移动了-π/2,而对于负频率成分,移动了π/2。下面这个示意图很直观地表示了Hilbert变换,在这里我画出了对原始信号做1到4次Hilbert变换的频谱示意图,是为了说明Hilbert变换的几个性质:

首先,可以看到,两次希尔伯特变换后,原信号相位翻转了180°,所以,Hilbert逆变换的公式显而易见,就是将正变换加一个符号即可。另外,还可以看到,Hilbert变换四次后就变回本身了。还有其它的性质,比如:

  1. 如果一个信号是两个信号的卷积,即 y = conv(v,x) ,那么Hilbert(y) = conv(Hilbert(v),x) = conv(v,Hilbert(x))这个性质,只要意识到Hilbert变换本质上是卷积就可以明白。
  2. x(t) 和 Hilbert(x(t))的能量以及平均功率相等,相关函数和功率谱相同。

希尔伯特变换的意义:

信号通过Hilbert变换后,正频率部分乘以-j,也就是说,保持幅度不变的条件下,将相位移动了-π/2,而对于负频率成分,移动了π/2,因此Hilbert变换又称为90°相移滤波器或者垂直滤波器[i]。

解析信号(解析过程)

对于任何一个实信号,利用构造解析函数的方法,可得到其在复空间的映射,映射方式是复数的实部与虚部互为Hilbert变换,因此,复值解析信号定义为:

  1. 这个过程有如下特点,首先,实部和虚部功率谱相同,自相关函数相同;另外,实部和虚部的互相关函数是一个奇函数。其他的还有:

以及一个最重要的特点,就是解析信号的功率谱只有正频段,强度为原来的四倍。或者说是只有正频段且幅度值为原来的两倍:

  1. 其中指数项描述复数信号在时域内旋转的矢量,实数包络控制振幅,表示相位,定义瞬时频率。VMD算法将分解得到的固有模态函数(Intrinsic Mode Function,IMF)定义为调幅调频信号(AM-FM),表达式为,其解析信号为:

推导过程利用欧拉公式:

这个公式说明,用复指数信号可以表示成一个实数信号和一个虚数信号的和的形式。而且,这个实部和虚部是有关系的,一个是cos,一个是sin,两者相差pi/2,看sin和cos的傅里叶变换。可以看出,在正频率上和负频率上两者的相位上的先后顺序刚好相反,但是都是保持90°的差值。看到这里,大概可以理解Hilbert变换的用意了吧。欧拉公式实际上是一种特殊的,或者说,最简单的Hilbert变换。复指数信号,就是等号左边的那个,频谱就是一个脉冲,而且是

只有正频率,且是两倍。虽然时域上是复数,但是在频域只有正分量,实际上是一种简化。

由于解析信号的单边谱只包含非负频率,只要根据上式解析信号的实部,即可恢复初始的实信号,即

希尔伯特变换下的解析信号意义:

        首先,将实数信号变换成解析信号的结果就是,把一个一维的信号变成了二维复平面上的信号,复数的模和幅角代表了信号的幅度和相位,如图所示:

这样看来,似乎复数信号才是完整的,而实信号只是在复平面的实轴上的一个投影。我们知道,解析信号可以计算包络(瞬时振幅)和瞬时相位。在上图中可以看到,实际上我们计算的包络就是黑色的线围成的立体图形的边界在实部的投影,而计算这个边的投影也很简单,就是在复平面上的螺旋线中的每一个点的模值,也就是A(t) = sqrt(x^2(t) + Hilbert(x(t))^2),而瞬时相位就是虚部(Hilbert变换后的)和实部(原始信号)在某一时间点的比值的arctan,瞬时频率就是它的导数。

3.

利用指数修正,使每个模态函数的频谱调制到相应的基频带;

调制定理:

调制信号在时域成以一个等幅高频振荡,相当于在频域把调制信号的各频率分量均搬至高频振荡的频率上,调制信号的各频率分量幅度减半。

混频原理:

参考CSDN博客链接整理:

www.blog.sina.com.cn/s/blog_ca1ec6aa0102vztg.html

而复信号则只有单边频率分量,正余弦和复信号的的傅里叶变换频率分量:

四种信号的频谱图如下:

由上式可知,一个信号在时域中与余弦、正弦或复信号相乘,等效于频域的频谱搬移

《更细致的请看博客》上有博客链接

混频是两个非线性信号合并的过程,进而获得交叉频项。最简单的乘法算子混合器通过混合两个独立的实数信号,得到频率分别为的混频输出,可用如下三角恒等式阐述:

两个独立解析信号的混合可表述如下:

由此可知,被混合的信号自动合成为只有一个频率的信号。在傅里叶变换中,以下的变换众所周知:

其中,为狄拉克分布。

频谱调制意义:

将解析信号与纯指数相乘将产生简单频移,上式是向右频移W0频率,变成高频信号,借助于高频载波信号传输低频信号(次声波信号)

4.

通过高斯平滑(即L2范数梯度的平方根)对信号解调,得到各模态函数带宽描述。

多谢博友解惑:

高斯平滑那里那个公式可以通过ft变换成带宽公式 这个公式在胡广书的那本现代信号处理里面有

高斯平滑滤波:高斯平滑 高斯模糊 高斯滤波器 ( Gaussian Smoothing, Gaussian Blur, Gaussian Filter ) C++ 实现 _hhygcy的博客-CSDN博客

均值滤波:均值滤波器 ( Mean Filter ) C++ 实现_hhygcy的博客-CSDN博客_均值滤波

范数规则化:

常用的L0、L1、L2和核范数规则化

机器学习中的范数规则化之(一)L0、L1与L2范数_zouxy09的博客-CSDN博客_l1范数

机器学习中的范数规则化之(二)核范数与规则项参数选择_zouxy09的博客-CSDN博客_核范数

L2规则化的目的:防止过拟合

什么是过拟合?

上面的图是线性回归,下面的图是Logistic回归,也可以说是分类的情况。从左到右分别是欠拟合(underfitting,也称High-bias)、合适的拟合和过拟合(overfitting,也称Highvariance)三种情况。可以看到,如果模型复杂(可以拟合任意的复杂函数),它可以让我们的模型拟合所有的数据点,也就是基本上没有误差。对于回归来说,就是我们的函数曲线通过了所有的数据点,如上图右。对分类来说,就是我们的函数曲线要把所有的数据点都分类正确。

 L2如何防止过拟合

         L2范数是指向量各元素的平方和然后求平方根。我们让L2范数的规则项||W||2最小,可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0,这里是有很大的区别的哦。而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。为什么越小的参数说明模型越简单?我也不懂,我的理解是:限制了参数很小,实际上就限制了多项式某些分量的影响很小(看上面线性回归的模型的那个拟合的图),这样就相当于减少参数个数。其实我也不太懂,希望大家可以指点下。

楼主认为“L2 正则项的作用是让所有的 w 都变小,而 w 越小模型越简单”,大家普遍感到难以理解,我在这里讲讲我自己的不同看法,希望能够帮到大家。 我认为 L2 正则项的作用并不是让所有的 w 都变小,而是【有选择地让某些 w 变小】。正如题主举得医生预测疾病的例子,样本中的特征有很多,但大部分特征都是无关紧要的,只有一小部分关键的特征支撑起了整个预测模型。表现在系数 w 上就是,大部分的 w_i 都是不幸的,因为它们刚好与那些无关紧要的特征结对,它们的大小对整个模型的效果影响不大,于是在正则项的约束下它们都变小了,甚至趋近于0;而只有小部分的 w_i 比较幸运,它们刚好对应到了好的特征,于是它们肩负起了非常重大的责任,它们的微小变化会引起模型曲线在走势上的根本性变化,损失函数会急剧增大。如果正则项妄图约束这些关键的 w_i,使它们变小,那么由此造成的损失函数的扩大将远大于从正则项上获得的微小收益,所以这些关键的 w_i 可以几乎不受正则项的干涉。 但也不尽然,如果你把正则项之前的系数 λ 调到非常大,那么它就会敢于压迫那些关键的 w_i,最终造成的结果是,模型确实变简单了,但也严重偏离了预期方向,没什么卵用了。相反,如果你把 λ 调得非常小,那么正则项对每个 w_i 都惹不起,即使是那些无关紧要的 w_i 它也无力约束,最终就会导致模型过拟合(试想 λ 等于0的情况)。所以,损失函数与正则项就像是博弈的双方,它们之间的力量对比通过参数 λ 进行调和。只有把 λ 调合适了,才能得到既不过拟合,又相对简单的好模型。从这种意义上来说,L2正则项与L1正则项类似,也有“特征选择”的效果。 上面的描述比较感性,是我为了方便直观理解做的一些比喻,如果把模型的预测曲线做出来会更加严谨一些。即每个 w_i 都影响着曲线的形态,但是有主次之分。那些低阶的、关键的 w_i 控制着曲线的整体走势;而那些高阶的、次要的 w_i 则是在曲线整体走势的基础上稍微扭曲曲线的形态;当然,还会有更高阶的 w_i,它们负责在大的扭曲之上制造更小的扭曲,以此类推。 这样看来L2正则项的作用就很明显了,要改变预测曲线的整体走势肯地会造成损失函数的不满,但是把曲线的形态熨平似乎并没有什么不妥。而 λ 的大小则决定了正则项的视野,即多大的弯曲算作走势?多小的弯曲算作扭曲?

VMD中L2正则化补充理解:

因为我们在上一部进行了一部频率调制使W变大,使用L2正则化相当于使非关键的W变小,关键的W没怎么有变化,相当于解调了

复合信号的中心频率分别为2Hz、24Hz、288Hz,对应于图2.3中各模态频谱图的峰值:

二、求解变分问题

VMD约束变分模型如下:

其中,为各模态函数,为各模态中心频率。

注:个人看法感觉就是一个多元函数求条件最值

多元函数:关于u(t)和w(t)的

约束条件:各模态分量和为原信号

解决上述的约束最优化问题,将约束变分问题转变为非约束变分问题,利用二次惩罚项和拉格朗日乘子法的优势,引入了增广Lagrangian函数,如式(2-18)所示:

步骤更新泛函:

迭代寻找最优解:

1、初始化uk、ωk、λ和n=0,k=0

2、n=n+1(迭代次数)

3、k=k+1,根据VMD算法公式更新uk、ωk

4、又根据相关的算法更新拉格朗日乘数λ

5、知直到满足一定条件,停止迭代,不然转到2步骤

以上只是求每一个模态的单步骤

个人理解总步骤:

1、初始化uk、ωk、λ和n=0,

2、n=n+1(迭代次数)

3、根据VMD算法公式更新uk、ωk

4、又根据相关的算法更新拉格朗日乘数λ

5、知直到满足一定条件根据(相似系数来判断),停止迭代,不然转到2步骤

6、k=k+1,将源信号减去分解出来的模态,并作为下次一循环的源信号,转到步骤1

三、VMD算法matlab代码

1.主循环代码,及其对应公式

% ----------- Main loop for iterative updates

while ( uDiff > tol &&  n < N ) % not converged and below iterations limit

k = 1;

sum_uk = u_hat_plus(n,:,K) + sum_uk - u_hat_plus(n,:,1);

u_hat_plus(n+1,:,k) = (f_hat_plus - sum_uk - lambda_hat(n,:)/2)./(1+Alpha(1,k)*(freqs - omega_plus(n,k)).^2);

if ~DC

omega_plus(n+1,k) = (freqs(T/2+1:T)*(abs(u_hat_plus(n+1, T/2+1:T, k)).^2)')/sum(abs(u_hat_plus(n+1,T/2+1:T,k)).^2);

end

% update of any other mode

for k=2:K

% accumulator

sum_uk = u_hat_plus(n+1,:,k-1) + sum_uk - u_hat_plus(n,:,k);

% mode spectrum

u_hat_plus(n+1,:,k) = (f_hat_plus - sum_uk - lambda_hat(n,:)/2)./(1+Alpha(1,k)*(freqs - omega_plus(n,k)).^2);

% center frequencies

omega_plus(n+1,k) = (freqs(T/2+1:T)*(abs(u_hat_plus(n+1, T/2+1:T, k)).^2)')/sum(abs(u_hat_plus(n+1,T/2+1:T,k)).^2);

end

lambda_hat(n+1,:) = lambda_hat(n,:) + tau*(sum(u_hat_plus(n+1,:,:),3) - f_hat_plus);

% loop counter

n = n+1;

% converged yet?

uDiff = eps;

for i=1:K

uDiff = uDiff + 1/T*(u_hat_plus(n,:,i)-u_hat_plus(n-1,:,i))*conj((u_hat_plus(n,:,i)-u_hat_plus(n-1,:,i)))';

end

uDiff = abs(uDiff);

end

2.VMD使用例程

% test-script for VMD
% authors: Dominique Zosso and Konstantin Dragomiretskiy
% zosso@math.ucla.edu --- http://www.math.ucla.edu/~zosso
% Initial release 2013-12-12 (c) 2013
%
% When using this code, please do cite our paper:
% -----------------------------------------------
% K. Dragomiretskiy, D. Zosso, Variational Mode Decomposition, IEEE Trans.
% on Signal Processing (in press)
% please check here for update reference:
%          http://dx.doi.org/10.1109/TSP.2013.2288675%--------------- Preparation
clear all;
close all;
clc;% Time Domain 0 to TT= 1000;
fs = 1/T;
t = (1:T)/T;
freqs = 2*pi*(t-0.5-1/T)/(fs);
wz=freqs;
% center frequencies of components          模态的中心频率
f_1 = 2;
f_2 = 24;
f_3 = 600;% modes
v_1 = cos(2*pi*f_1*t);
v_2 =cos(2*pi*f_2*t)/4;
v_3 =cos(2*pi*f_3*t)/16;% for visualization purposes
fsub = {};
wsub = {};
fsub{1} = v_1;
fsub{2} = v_2;
fsub{3} = v_3;
wsub{1} = 2*pi*f_1;
wsub{2} = 2*pi*f_2;
wsub{3} = 2*pi*f_3;% composite signal, including noise
y = v_1 + v_2 + v_3;         % 原信号
x = awgn(y,5);               % 将白色高斯噪声添加到信号中f_hat = fftshift((fft(x)));%fft快速傅里叶变换,fftshift的作用是正半轴和负半轴部分图像分别关于各自中心对称。fft得到的数据与频率是不对应的,fftshift可以纠正。for sub = 1:length(fsub)%1-3figure('Name', ['Input signal component ' num2str(sub)] );%figure创建一个窗口,参数可以默认无,也可以是大于0的数据。figure('name','例子')plot(t,fsub{sub}, 'k');xlabel('t/s');ylabel(['signal' num2str(sub)]);%num2str()将数字转为字符串。t为横坐标,sub=1.fsub(1)为V1.k为黑色线。set(gca, 'XLim', [0 1]);%get current axis 返回当前坐标轴,handlexlim:限制x轴范围[0 1]endfigure('Name', 'Composite input signal' );
plot(t,x, 'k');xlabel('t/s');ylabel('幅值');
set(gca, 'XLim', [0 1]); % some sample parameters for VMD       VMD的样本参数
alpha = 2000;        % 每个模态初始中心约束强度,增广Lagrange的二次惩罚因子,降低高斯噪声的干扰。
tau = 0;            % noise-tolerance (no strict fidelity enforcement)噪音容忍(无严格的保真执行),一般取零
K = 3;              % 3 modes模态数
DC = 0;             % no DC part imposed不设直流部分
init = 1;           % initfialize omegas uniformly 初始化Ω一致
tol = 1e-7;         %总信号拟合误差允许程度%--------------- Run actual VMD code[u, u_hat, omega] = VMD(x, alpha, tau, K, DC, init, tol);%--------------- Visualization       可视化—图像% For convenience here: Order omegas increasingly and reindex u/u_hat
[~, sortIndex] = sort(omega(end,:));
omega = omega(:,sortIndex);
u_hat = u_hat(:,sortIndex);
u = u(sortIndex,:);
linestyles = {'b', 'g', 'm', 'c', 'c', 'r', 'k','b', 'g', 'm'};figure('Name', 'BLIMFs');
for k = 1:Ksubplot(K,1,k);plot(t,u(k,:), linestyles{k});  hold on;xlabel('t/s');ylabel(['BLIMF' num2str(k)]);set(gca, 'XLim', [0 1]);
endfigure('Name', 'Input signal spectrum' );
loglog(freqs(T/2+1:end), abs(f_hat(T/2+1:end)), 'k');
set(gca, 'XLim', [1 T/2]*pi*2, 'XGrid', 'on', 'YGrid', 'on', 'XMinorGrid', 'off', 'YMinorGrid', 'off');
ylims = get(gca, 'YLim');
xlabel('w/rad/s');ylabel('Input signal spectrum');
hold on;
for sub = 1:length(wsub)loglog([wsub{sub} wsub{sub}], ylims, 'k--');
end
set(gca, 'YLim', ylims);figure('Name', 'Evolution of center frequencies omega');
for k=1:Ksemilogx(2*pi/fs*omega(:,k), 1:size(omega,1), linestyles{k});hold on;
end
set(gca, 'YLim', [1,size(omega,1)]);
set(gca, 'XLim', [2*pi,0.5*2*pi/fs], 'XGrid', 'on', 'XMinorGrid', 'on');figure('Name', 'Spectral decomposition');
loglog(freqs(T/2+1:end), abs(f_hat(T/2+1:end)), 'k:');
set(gca, 'XLim', [1 T/2]*pi*2, 'XGrid', 'on', 'YGrid', 'on', 'XMinorGrid', 'off', 'YMinorGrid', 'off');
hold on;
for k = 1:Kloglog(freqs(T/2+1:end), abs(u_hat(T/2+1:end,k)), linestyles{k});
end
set(gca, 'YLim', ylims);xlabel('w/rad/s');ylabel('spectrum decomposition');

四、VMD代码(含有详细注释版,更加快速入门)

https://download.csdn.net/download/ARM_qiao/85039968https://download.csdn.net/download/ARM_qiao/85039968

二、信号分解 —> 变分模态分解(VMD)学习笔记相关推荐

  1. 变分模态分解 python_浅谈VMD(变分模态分解)

    学号:19011210554   姓名:袁博 [嵌牛导读]:好多人看着VMD看博客最想知道的就是这东西的应用和大概步骤原理,而具体原理算法不太感兴趣,而且也不太容易看懂.本文既然是浅谈,就讲解一下VM ...

  2. matlab中使用VMD(变分模态分解)

    最近我们被客户要求撰写关于VMD(变分模态分解)的研究报告,包括一些图形和统计输出. 拨号音信号的变模分解 创建一个以4 kHz采样的信号,类似于拨打数字电话的所有键.将信号另存为MATLAB®时间数 ...

  3. vmd变分模态分解程序matlab论坛_博士兼职辅导员论坛分享会第三期

    新一期经验分享报告会又来了!本次报告满满干货,快来看看都有些什么内容吧? 报告题目 齿轮箱关键零部件复合故障特征提取方法研究 报告摘要: 基于振动信号的复合故障特征提取技术一直以来都是旋转机械故障诊断 ...

  4. 鲸鱼算法优化变分模态分解(VMD)包络熵和参数的特征提取及MATLAB代码实现

    目录 1 简介 2 变分模态分解VMD原理 3 鲸鱼优化算法优化VMD原理 3.1. 鲸鱼优化算法优化VMD原理及流程 3.2. 特征提取流程 4 优化效果 4.1. VMD各分量信号时域图 4.2. ...

  5. 利用智能算法优化参数的自适应变分模态分解,VMD实现混合储能系统的分频

    关键词:混合储能,VMD,麻雀搜索算法,遗传算法,混合储能容量配置优化,混合储能功率分配,利用智能算法优化参数的自适应变分模态分解,VMD实现混合储能系统的分频,高频分配给超级电容器,低频分配给蓄电池 ...

  6. 分解得到的时频域特征_【推荐文章】基于变分模态分解和广义Warblet变换的齿轮故障诊断...

    <机械传动>2018年  第42卷   第7期 文章编号:1004-2539(2018)07-0157-05 DOI:10.16578/j.issn.1004.2539.2018.07.0 ...

  7. 变分模态分解_Android小部件示例中的模态对话框(弹出)

    变分模态分解 在此示例中,我们将看到如何在主屏幕中创建一个可以打开弹出对话框的Android小部件. 如您所知,Android Widgets是小型应用程序,基本上可以做两件事. 按下时启动新的活动, ...

  8. 【vn.py学习笔记(二)】vn.py底层接口 学习笔记

    [vn.py学习笔记(二)]vn.py底层接口 学习笔记 1 CTP API的工作原理 1.1 CTP介绍 1.2 API功能介绍 1.3 CTP API文件 1.4 API 通用规则 2 CTP A ...

  9. linux环境vmd下载,VMD Linux版下载|VMD(变分模态分解程序) V1.9.3 Linux版 下载_当下软件园_软件下载...

    VMD Linux版是款适用于Linux操作系统的分子运动绘图分析模拟软件.它可以真实的模拟分析的运动场景,提供可视化的图形界面,帮助用户更好的理解分析变化,提高研究效率,操作简单,方便快捷,非常好用 ...

  10. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

最新文章

  1. 万万没想到! logger.info() 还能导致线上故障?
  2. SQL 的Over 子句
  3. insert exec 语句不能嵌套_走向DBA「MSSQL篇」 - 从SQL语句的角度提高数据库的访问性能...
  4. Python for 循环语句-Python 基础教程
  5. 我们无法更新系统保留的分区_系统更新是我们手机的基本功能之一 安卓智能更新有哪些用途...
  6. 第十一届蓝桥杯python试题_Python描述 第十一届蓝桥杯省赛第一场 试题 I: 字符串编码...
  7. 翻译 - 【Dojo Tutorials】Part 2 - Developing a Dojo Mobile Application: FlickrView
  8. quartz配置详解
  9. 解析IP代理软件市场上的发展现状
  10. Ffmpeg常用转码命令
  11. 深入解析CAS算法原理
  12. C++获取SMART信息
  13. 基于servlet+jsp 个人博客系统
  14. 美团的战略、战术和能力圈 附下载地址
  15. 【Mybatis从入门到实战教程】第一章 Mybatis 入门
  16. 联想windows无法自动修复此计算机,联想win10自动修复无法开机-联想win10自动修复无法开机方法 - 系统家园...
  17. 在网页中使用iframe嵌入B站视频(腾讯视频同理)
  18. 宁波初级职称证书查询
  19. 《操作系统导论》第37章课后答案
  20. 一起来做NES开发(1)

热门文章

  1. 浅析MyBatis执行器原理
  2. git如何添加远程主机_Git由浅入深之远端主机(git remote)
  3. python 的库如何开发_Python开发者必备6个基本库
  4. 输出ipv4,ipv6特定段的所有地址,ipv6地址转换成网络字节序
  5. 别再为了this发愁了:JS中的this机制
  6. Centos 7.0 的svn
  7. vim安装airline
  8. win32 api应用如何输出日志log Windows程序设计 visualstudio vs无控制台如何输出
  9. JAVA编程思想课程视频
  10. Linux 上免费的视频转换器FFmpeg