H264 CAVLC 研究

目录
  • 1 CAVLC概念
  • 2 CAVLC原理
  • 3 CAVLC编码流程
  • 4 CAVLC解码流程
  • 展开全部
摘要纠错编辑摘要

CAVLC即基于上下文的自适应变长编码。H.264标准中使用CAVLC对4*4模块的亮度和色度残差数据进行编码。

CAVLC-CAVLC概念

CAVLC的全称是Context-Adaptive Varialbe-Length Coding,即基于上下文的自适应变长编码。CAVLC的本质是变长编码,它的特性主要体现在自适应能力上,CAVLC可以根据已编码句法元素的情况动态的选择编码中使用的码表,并且随时更新拖尾系数后缀的长度,从而获得极高的压缩比。H.264标准中使用CAVLC对4×4模块的亮度和色度残差数据进行编码。

CAVLC-CAVLC原理


在H.264标准编码体系中,视频图像在经过了预测、变换及量化编码后表现出如下的特性:4×4块残差数据块比较稀疏,其中非零系数主要集中在低频部分,而高频系数大部分是零;量化后的数据经过zig-zag扫描,DC系数附近的非零系数值较大,而高频位置上的非零系数值大部分是+1和-1;相邻的4×4块的非零系数的数目是相关的。CAVLC就是利用编码后残差数据的这些特性,通过自适应对不同码表的选择,利用较少的编码数据对残差数据进行无损的熵编码,进一步减少了编码数据的冗余和相关性,提高了H.264的压缩效率。

CAVLC-CAVLC编码流程


视频图像在经过预测、变换和量化编码后,需要经过Zig-zag扫描和重新的排序过程,为后序的CAVLC编码进行准备。一个残差数据块的CAVLC熵编码的流程如图所示:

CAVLC熵编码处理流程CAVLC熵编码处理流程

1、TotalCoeffs和TrailingOnes的编码


从码流的起始位置开始计算整个编码块中非零系数的数目(TotalCoeffs),非零系数的数目为从0-16,非零系数的数目被赋值给变量TotalCoeffs。
拖尾系数是指码流中正或者负1的个数(+/-1)。拖尾系数的数目(TrailingOnes)被限定在3个以内,如果+/-1的数目超过3个,则只有最后3个被视为拖尾系数,其余的被视为普通的非零系数,拖尾系数的数目被赋值为变量TrailingOnes。 

2、判断计算nC值

nC(Number Current 当前块值)值的计算集中体现了CAVLC的基于上下文的思想,通过nC值选择不同H.264标准附录CAVLC码表。 

3、查表获得coeff_token编码

根据之前编码和计算过程所得的变量TotalCoeffs、TrailingOnes和nC值可以查H.264标准附录CAVLC码表,即可得出coeff_token编码序列。

4、编码每个拖尾系数的符号:前面的coeff_token编码中已经包含了拖尾系数的总数,还需进一步对拖尾系数的符号进行编码。由于拖尾系数符合为正(+)或负(-),因此,在H.264标准中规定用0表示正1(+1)、1表示负1(-1)。当拖尾系数的数目超过3个只有最后3个被认定为拖尾系数,因此对符号的编码顺序应按照反向扫描的顺序进行。

5、编码除拖尾系数之外的非零系数的幅值(Levels)

非零系数的幅值(Levels)由两个部分组成:前缀(level_prefix)和后缀(level_suffix)。levelCode、levelSuffixsSize和suffixLength是编码过程中需要使用的三个变量,其中levelCode是中间过程中用到的无符号数,levelSuffixsSize表示后缀长度位数,suffixLength代表Level的码表序号。

6、编码最后一个非零系数前零的数目(TotalZeros)

TotalZeros指的是在最后一个非零系数前零的数目,此非零系数指的是按照正向扫描的最后一个非零系数。因为非零系数数目(TotalCoeffs)是已知,这就决定了TotalZeros可能的最大值。根据TotalCoeffs值,H.264标准共提供了25个变长表格供查找,其中编码亮度数据时有15个表格供查找,编码色度DC 2×2块(4:2:0格式)有3个表格、编码色度DC 2×4块(4:2:2格式)有7个表格。

7、编码每个非零系数前零的个数(RunBefore)

在CAVLC中,变量 ZerosLeft表示当前非零系数左边的所有零的个数,ZerosLeft的初始值等于TotalZeros。每个非零系数前零的个数(RunBefore)是按照反序来进行编码的,从最高频的非零系数开始。H.264标准中根据不同ZerosLeft和RunBefore,构建了RunBefore编码表格供编码查找使用。根据表格每编码完一个RunBefore,对ZerosLeft的值进行更新,继续编码下一个RunBefore,直至全部完成所有非零系数前零的个数的编码。当ZerosLeft=0即没有剩余0需要编码时或者只有一个非零系数时,均不需要再进行RunBefore编码。

CAVLC-CAVLC解码流程

CAVLC熵解码是上述CAVLC熵编码的逆过程,CAVLC熵解码的输入数据是来自片层数据的比特流,解码的基本单位是一个4×4的像素块,输出为包含4×4块每个像素点所有幅值的序列。CAVLC解码步骤如下:
1. 初始化所有的系数幅值
2. 解码非零系数个数(TotalCoeff)和拖尾系数个数(TrailingOnes)。
3. 解码拖尾系数符号(trailing_ones_sign_flag)
4. 解码非零系数幅值
5. 解码total_zeros和run_before
6. 组合非零系数幅值和游程信息,得到整个残差数据块

 

H.264 CAVLC编解码详解
2007-04-20 21:53

CAVLC: Context-Adaptive Variable-Length Coding
用于亮度和色度残差数据的编码.
经过变化量化后的残差有如下特性:非零系数集中在低频部分,而高频系数大部分是零; 量化后的数据经Zig-Zag扫描后DC系数附近的非零系数数值较大,而高频位置上的非零系数值大部分是+1和-1;相邻4*4块的非零系数的数码是相关的.

CAVLC模型选择主要体现:非零系数编码所需表格的选择和拖尾系数后缀长度的更新;

编码过程
1.初始化
确定NC值
NC则与当前块左边非零系数数目NA和上面块的非零系数数目NB求得的:
NC = (NA+NB)/2   NA,NB都可以能是没有的(处于边缘时),此时以0计之
色度的直流系数NC=-1
NC值与表格的对应 0-1:Num-VLC0 2-3:Num-VLC1 4-7:Num-VLC2 >=8:FLC(定长表格)

2.编码非零系数的数目(TotalCoeffs: 0-16)和拖尾系数数目(TrailingOnes: 0-3)
两个数目的编码过程是通过查表实现的,而表格的选择是根据变量NC(Number Current,当前块值);

3.编码每个拖尾系数的符号
符号用一个比特表示 0表示+ 1表示-

4.编码除了拖尾系数之外的非零系数的幅值Levels
过程:
1)将有符号的Level[i]转换成无符号的LevelCode
Level[i]为正, levelCode=(Level[i]<<1)-2;
Level[i]为负, levelCode=-(Level[i]<<1)-1;
2)计算level_prefix
level_prefix=levelCode/(1<<suffixLength), 查标准中的表9-6可得对应的bit_string
3)计算level_suffix
level_suffix=levelCode%(1<<suffixLength)
4)根据suffixLength的值确定后缀的长度

5)更新suffixLength
if(suffixLength == 0)++suffixLength;
else if(levelCode > (3<<suffixLength-1) && suffixLength < 6)++suffixLength

5.编码最后一个非零系数前零的数目TotalZeros
查标准中的表9-7

6.编码每个非零系数前零的个数RunBefore
查标准中的表9-10


解码过程
1.初始化
确定NC值

2.确定TotalCoeffs和TrailingOnes
根据NC值和coeff_token值查表9-5

3.根据TrailingOnes确定拖尾1的符号

4.解析除拖尾系数之外的非零系数的幅值(解码Levels)
1)确定suffixLength初始值
if(TotalCoeffs>10 && TrailingOnes<3)suffixLength=1;
else suffixLength=0;

2)计算得到Level[i]
先得到level_prefix(形式如{0}^*1: n个0后一个1)
根据suffixLength读取编码中的suffixLength位作为level_suffix
levelCode=level_prefix<<suffixLength+level_suffix
if(levelCode%2==0)Level[i]=(levelCode+2)/2
else Level[i]=(-levelCode-1)/2

3)更新suffixLength
if(suffixLength == 0)++suffixLength;
else if(levelCode > (3<<suffixLength-1) && suffixLength < 6)++suffixLength

5.根据得到的TotalCoeff数值和TotalZeros编码值得到TotalZeros数值

6.解析每个非零系数前零的数目(解码RunBefore)
zeroleft = TotalZeros;
i=TotalCoeffs-1;
while(zeroleft>0 && i>0)
{
   根据zeroleft查找匹配的run_before[i]值;
   i=i-1;
   zeroleft = zeroleft-runbefore[i];
   if(zeroleft==0 || i==0)
   {
     run_before[i]=zeroleft;
     break;
   }
}

例子:假定用了Num-VLC0表
4*4 Block
{
0,3,-1,0;
0,-1,1,0;
1,0,0,0;
0,0,0,0;
}

Reodered block:
0,3,0,1,-1,-1,0,1,0,...
TotalCoeffs=5
TotalZeros=3
TrailingOnes=3

编码
Element   Value      Code
coeff_token   TotalCoeffs=5, T1s=3    0000100;根据coeff_token到TotalCoeff和TrailingOnes映射表
T1 sign (4)   +      0
T1 sign (3)   -      1
T1 sign (2)   -      1
Level (1)   +1 (use Level_VLC0)    1;
Level (0)   +3 (use Level_VLC1)    0010;
TotalZeros   3      111;TotalCoeff和TotalZeros的映射表
run_before(4)   ZerosLeft=3; run_before=1   10;run_before表
run_before(3)   ZerosLeft=2; run_before=0   1
run_before(2)   ZerosLeft=2; run_before=0   1
run_before(1)   ZerosLeft=2; run_before=1   01
run_before(0)   ZerosLeft=1; run_before=1   No code required; last coefficient.

Decoding:
Code    Element Value      Output array
0000100   coeff_token TotalCoeffs=5, T1s=3   Empty
0    T1 sign +      1
1    T1 sign -      -1, 1
1    T1 sign -      -1, -1, 1
1    Level +1      1, -1, -1, 1
0010    Level +3      3, 1, -1, -1, 1
111    TotalZeros 3      3, 1, -1, -1, 1
10    run_before 1      3, 1, -1, -1, 0, 1
1    run_before 0      3, 1, -1, -1, 0, 1
1    run_before 0      3, 1, -1, -1, 0, 1
01    run_before 1      3, 0, 1, -1, -1, 0, 1

 

 

 

 

[转贴] CAVLC编码过程详解——Sunrise

谨以此文献给QQ群“H.264乐园”和群里那些无私奉献的同行朋友!
也希望能对刚进入这个领域的朋友有所帮助,欢迎做过CAVLC的同行能批评指正!

编码过程:
假设有一个4*4数据块
{
0, 3, -1, 0,
0, -1, 1, 0,
1, 0, 0, 0,
0, 0, 0, 0
}
数据重排列:0,3,0,1,-1,-1,0,1,0……


1) 初始值设定:
非零系数的数目(TotalCoeffs) = 5;
拖尾系数的数目(TrailingOnes)= 3;
最后一个非零系数前零的数目(Total_zeros) = 3;
变量NC=1;
(说明:NC值的确定:色度的直流系数NC=-1;其他系数类型NC值是根据当前块左边4*4块的非零系数数目(NA)当前块上面4*4块的非零系数数目(NB)求得的,见毕厚杰书P120表6.10)
suffixLength = 0;
i = TotalCoeffs = 5;

2) 编码coeff_token:
查标准(BS ISO/IEC 14496-10:2003)Table 9-5,可得:
If (TotalCoeffs == 5 && TrailingOnes == 3 && 0 <= NC < 2)
coeff_token = 0000 100;
Code = 0000 100;

3) 编码所有TrailingOnes的符号:
逆序编码,三个拖尾系数的符号依次是+(0),-(1),-(1);
即:
TrailingOne sign[i--] = 0;
TrailingOne sign[i--] = 1;
TrailingOne sign[i--] = 1;
Code = 0000 1000 11;

4) 编码除了拖尾系数以外非零系数幅值Levels:
过程如下:
(1)将有符号的Level[ i ]转换成无符号的levelCode;
如果Level[ i ]是正的,levelCode = (Level[ i ]<<1) – 2;  
如果Level[ i ]是负的,levelCode = - (Level[ i ]<<1) – 1;
(2)计算level_prefix:level_prefix = levelCode / (1<<suffixLength);
查表9-6可得所对应的bit string;
(3)计算level_suffix:level_suffix = levelCode % (1<<suffixLength);
(4)根据suffixLength的值来确定后缀的长度;
(5)suffixLength updata:
If ( suffixLength == 0 )
suffixLength++;
else if ( levelCode > (3<<suffixLength-1) && suffixLength <6)
suffixLength++;

回到例子中,依然按照逆序,Level[i--] = 1;(此时i = 1)
levelCode = 0;level_prefix = 0;
查表9-6,可得level_prefix = 0时对应的bit string = 1;
因为suffixLength初始化为0,故该Level没有后缀;
因为suffixLength = 0,故suffixLength++;
Code = 0000 1000 111;
编码下一个Level:Level[0] = 3;
levelCode = 4;level_prefix = 2;查表得bit string = 001;
level_suffix = 0;suffixLength = 1;故码流为0010;
Code = 0000 1000 1110 010;
i = 0,编码Level结束。

5)编码最后一个非零系数前零的数目(TotalZeros):
查表9-7,当TotalCoeffs = 5,total_zero = 3时,bit string = 111;
Code = 0000 1000 1110 0101 11;

6) 对每个非零系数前零的个数(RunBefore)进行编码:
i = TotalCoeffs = 5;ZerosLeft = Total_zeros = 3;查表9-10:
依然按照逆序编码
ZerosLeft =3, run_before = 1 run_before[4]=10;
ZerosLeft =2, run_before = 0 run_before[3]=1;
ZerosLeft =2, run_before = 0 run_before[2]=1;
ZerosLeft =2, run_before = 1 run_before[1]=01;
ZerosLeft =1, run_before = 1 run_before[0]不需要码流来表示
Code = 0000 1000 1110 0101 1110 1101;
编码完毕。

----------------------------------Sunrise------

[[i] 本帖最后由 firstime 于 2008-9-4 02:49 PM 编辑 [/i]]

davesliu 发表于 2006-11-20 12:03 PM

请问斑竹,老毕书上120页表6.10中第2行和第三行的NA和NB是不是给弄反了?

vcforever 发表于 2006-12-7 11:06 PM

应该是弄反了

dmsd 发表于 2006-12-18 05:42 PM

请问trailing ones是指所有绝对值为1的系数的个数还是连续绝对值为1的系数的个数。

谢谢。

firstime 发表于 2006-12-18 11:29 PM

倒数三个 +/-1

另:可结合本论坛帖子“[url=http://bbs.chinavideo.org/viewthread.php?tid=1057][color=blue][b]CAVLC中的前缀和后缀[/b][/color][/url]”学习。

[[i] 本帖最后由 firstime 于 2008-5-20 09:59 PM 编辑 [/i]]

achen 发表于 2007-1-17 05:50 PM

“如果Level[ i ]是负的,levelCode = - (Level[ i ]<<1) – 1”
假如Level[ i ]=-3,levelCode值是多少啊?
还有能不能详细讲解一下如何确定suffixLength的取值,它跟域值的关系怎么确定?
谢谢!

[[i] 本帖最后由 firstime 于 2007-1-27 10:06 PM 编辑 [/i]]

dcfarmer 发表于 2007-1-28 11:22 AM

讨论

是JM86运行后的trace记录

@160   Luma # c & tr.1s(0,0) vlc=0 #c=11 #t1=1         000000000001110 ( 11)
@175   Luma trailing ones sign (0,0)                                 0 (  0)
@176   Luma lev (0,0) k=9 vlc=1 lev= -2                             11 ( -1)
@178   Luma lev (0,0) k=8 vlc=1 lev= -1                             11 ( -1)
@180   Luma lev (0,0) k=7 vlc=1 lev=  1                             10 (  1)
@182   Luma lev (0,0) k=6 vlc=1 lev= -5                         000011 ( -5)
@188   Luma lev (0,0) k=5 vlc=2 lev=-11                       00000101 (-11)
@196   Luma lev (0,0) k=4 vlc=3 lev= -3                           1101 ( -3)
@200   Luma lev (0,0) k=3 vlc=3 lev=  3                           1100 (  3)
@204   Luma lev (0,0) k=2 vlc=3 lev=  3                           1100 (  3)
@208   Luma lev (0,0) k=1 vlc=3 lev=-12                         001111 (-12)
@214   Luma lev (0,0) k=0 vlc=3 lev=  9                         001000 (  9)
上面这段是trace.txt中的记录,根据前面的vlc=0 #c=11 #t1=1,就是trailing_ones 的个数是1个(@175   Luma trailing ones sign (0,0)        0 (  0) )也能说明,但是在下面的level中,明明还要-1,1可以作为trailing_ones的,为什么不把这两个数当作trailing_ones呢??而是作为level呢????

dcfarmer 发表于 2007-1-28 11:40 AM

回答

接上面的问题,在群里面讨论弄明白了
在CAVLC编码中,从右往左看,算trailing_ones时,在右边不能有abs()>1的数,还有算trailing_ones的个数的话,也不能被别的abs()>1的数隔断,如果隔断的话,只能计数到隔断数为止,而且要保证个数<=3。例如。。。。2,3,0,0,0,1,1,1,0,0,2 ,这个序列中triailing_ones是没有的。还有。。。。。1,0,0,-1,3,1,0,0,0,0,算trailing_ones 个数时,只能有一个也就是3后面的“1”算一个,3前面的-1和1由于被3隔断,所以不能算入其中。

[[i] 本帖最后由 dcfarmer 于 2007-6-7 03:27 PM 编辑 [/i]]

zjh1004 发表于 2007-8-26 09:55 PM

ZerosLeft =1, run_before = 1      run_before[0]不需要码流来表示

请问:为什么不需要码流来表示?
是因为是最后一位吗?
查表知:此时 run_before[0]=0

timek 发表于 2007-9-11 06:35 PM

回复 #6 achen 的帖子

Level[ i ]=-3,levelCode值是多少啊?

levelcode应该是3

grassland_fly 发表于 2007-9-12 03:47 PM

[size=12px]ZerosLeft =1, run_before = 1      run_before[0]不需要码流来表示

请问:为什么不需要码流来表示?
是因为是最后一位吗?
查表知:此时 run_before[0]=0[/size]
[size=12px] [/size]
[size=12px]---------------------------------------------------------[/size]
[size=12px] [/size]
[size=12px]I think it's because can know the vaule based on the value before. :)[/size]

generalair 发表于 2007-10-22 02:51 PM

2007-1-28 11:22 AM dcfarmer
讨论

是JM86运行后的trace记录

@160   Luma # c & tr.1s(0,0) vlc=0 #c=11 #t1=1         000000000001110 ( 11)
@175   Luma trailing ones sign (0,0)                                 0 (  0)
@176   Luma lev (0,0) k=9 vlc=1 lev= -2                             11 ( -1)
@178   Luma lev (0,0) k=8 vlc=1 lev= -1                             11 ( -1)
@180   Luma lev (0,0) k=7 vlc=1 lev=  1                             10 (  1)
@182   Luma lev (0,0) k=6 vlc=1 lev= -5                         000011 ( -5)
@188   Luma lev (0,0) k=5 vlc=2 lev=-11                       00000101 (-11)
@196   Luma lev (0,0) k=4 vlc=3 lev= -3                           1101 ( -3)
@200   Luma lev (0,0) k=3 vlc=3 lev=  3                           1100 (  3)
@204   Luma lev (0,0) k=2 vlc=3 lev=  3                           1100 (  3)
@208   Luma lev (0,0) k=1 vlc=3 lev=-12                         001111 (-12)
@214   Luma lev (0,0) k=0 vlc=3 lev=  9                         001000 (  9)


请问上面这段TRACE记录对应的16个系数序列是什么?谢谢

boleaon 发表于 2007-11-8 04:46 PM

好贴...

kdjwang 发表于 2008-10-10 03:52 PM

回复 #10 timek 的帖子

levelcode应该是5,level先乘2为-6,再取反减1
解码时因为levelcode为奇数,level = (‐levelCode‐1)/2

libra811 发表于 2008-12-29 10:44 PM

刚学习,受用了。谢谢

peiyangpr 发表于 2009-1-4 05:28 PM

毕厚杰P123,6.8.6节中所给例子是否有误?是否应如下编码?

0        0        -1        0
5        2        0        0
3        0        0        0
1        0        0        0        
数据重排:0,0,5,3,2,-1,0,0,0,1……
其中TotalCoeffs = 5, TrailingOnes = 2, Total_zeros = 5, NC = 3

编码过程:
元素                                                   数值                                                            编码
Coeff_token                                      TotalCoeffs = 5, TrailingOnes = 2               0000101
Trailingones_sign_flag(1)                 +                                                                  0
Tranlingones_sign_flag(0)                -                                                                   1
Level(2)                                            1 (suffixLenth = 0)                                        1
Level(1)                                            3 (suffixLength = 1)                                      0010
Level(0)                                            5 (suffixLength = 1)                                      000010
Total_zeros                                      5                                                                   101
Run_before(4)                                 Zeroleft = 5, run_before = 3                          010
Run_before(4)                                 Zeroleft = 2, run_before = 0                          1
Run_before(4)                                 Zeroleft = 2, run_before = 0                          1
Run_before(4)                                 Zeroleft = 2, run_before = 0                          1
Run_before(4)                                    Zeroleft = 2, run_before = 2                               无

最终编码输出:000010110010000010101010111

[[i] 本帖最后由 peiyangpr 于 2009-1-4 09:16 PM 编辑 [/i]]

 

residual_block_cavlc( coeffLevel, maxNumCoeff ) {  C      Descriptor
    for( i = 0; i < maxNumCoeff; i++ )          
        coeffLevel[ i ] = 0     
    // coeff_token      指明了非零系数的个数,拖尾系数的个数。      
    coeff_token 
    if( TotalCoeff( coeff_token ) > 0 ) {          
        if( TotalCoeff( coeff_token ) > 10    &&    TrailingOnes( coeff_token ) <
3 )
            suffixLength = 1          
        else          
            suffixLength = 0          
        for( i = 0; i < TotalCoeff( coeff_token ); i++ )          
            if( i < TrailingOnes( coeff_token ) ) {           
                // trailing_ones_sign_flag  拖尾系数的符号
                    -     如果trailing_ones_sign_flag = 0,  相应的拖尾系数是+1。
                    -     否则,trailing_ones_sign_flag =1,相应的拖尾系数是-1。 
                trailing_ones_sign_flag  
                level[ i ] = 1 – 2 * trailing_ones_sign_flag          
            } else {          
                // level_prefix and level_suffix  非零系数值的前缀和后缀。 
                level_prefix 
                levelCode = ( level_prefix << suffixLength )          
                if( suffixLength > 0    | |    level_prefix >= 14 ) {          
                    level_suffix  
                    levelCode += level_suffix          
                }          
                if( level_prefix    = =    15    &&    suffixLength    = =    0 )          
                    levelCode += 15          
                if( i    = =    TrailingOnes( coeff_token )    &&    
                      TrailingOnes( coeff_token ) < 3 )
                    levelCode += 2          
                if( levelCode % 2    = =    0 )          
                    level[ i ] = ( levelCode + 2 ) >> 1          
                else          
                    level[ i ] = ( –levelCode – 1 ) >> 1          
                if( suffixLength    = =    0 )          
                    suffixLength = 1          
                if( Abs( level[ i ] )    >    ( 3 << ( suffixLength – 1 ) )    &&    
                      suffixLength < 6 )
                    suffixLength++          
            }          
        if( TotalCoeff( coeff_token ) < maxNumCoeff ) {          
            // total_zeros    系数中 0 的总个数。
            total_zeros   
            zerosLeft = total_zeros          
        } else          
            zerosLeft = 0          
        for( i = 0; i < TotalCoeff( coeff_token ) – 1; i++ ) {          
            if( zerosLeft > 0 ) {          
               
                run_before   
                run[ i ] = run_before          
            } else          
                run[ i ] = 0          
            zerosLeft = zerosLeft – run[ i ]          
        }          
        run[ TotalCoeff( coeff_token ) – 1 ] = zerosLeft          
        coeffNum = -1          
        for( i = TotalCoeff( coeff_token ) – 1; i >= 0; i-- ) {          
            coeffNum += run[ i ] + 1          
            coeffLevel[ coeffNum ] = level[ i ]            
        }          
    }          
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xfding/archive/2010/04/12/5477464.aspx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

instanceof 的运用

2019独角兽企业重金招聘Python工程师标准>>> Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出&#xff0c;这个对象是否是这个特定类或者是它的子类的一个实例。 用法&#xff1a; result object i…

R 脚本读取汇总 Excel 表格数据

主要用到了 xlsx 和 rJava 包&#xff0c;打开 Excel 文件&#xff0c;读取各表格数据&#xff0c;再写入到汇总表。 下图为处理前的原始数据表格&#xff1a; 下图为处理后的数据&#xff1a; 代码实现 安装&加载包的函数实现。installed.packages() 函数获取所有已安装…

【大数据】最新大数据学习路线(完整详细版,含整套教程)

大数据学习路线 java(Java se,javaweb) Linux(shell,高并发架构,lucene,solr) Hadoop(Hadoop,HDFS,Mapreduce,yarn,hive,hbase,sqoop,zookeeper,flume) 机器学习(R,mahout) Storm(Storm,kafka,redis) Spark(scala,spark,spark core,spark sql,spark streaming,spark mllib,spa…

谷歌浏览器开发调试工具中Sources面板 js调试等 完全介绍

这次分享的是Chrome开发工具中最有用的面板Sources。 Sources面板几乎是我最常用到的Chrome功能面板&#xff0c;也是在我看来决解一般问题的主要功能面板。通常只要是开发遇到了js报错或者其他代码问题&#xff0c;在审视一遍自己的代码而一无所获之后&#xff0c;我首先就会打…

【Python】最新Python学习路线(完整详细版,含整套教程)

python目前应用最广的三个岗位&#xff1a;全栈开发、数据分析、运维开发&#xff0c;今天我们就以这三个重点的岗位来做一下自学Python的规划&#xff0c;希望你在学之前就能有明确的学习方向。 最近开始整理python的资料&#xff0c;博主建立了一个qq群&#xff0c;希望给大家…

程序员,软件测试知多少?

送给初级程序员的测试认知文作为开发同学&#xff0c;一些基本的测试岗位相关知识还是很有必要了解一下&#xff0c;免的某些同学在工作中和测试同学斗嘴、打架、群殴等以及被测试鄙视....。 我们常常听说的一些测试专业术语&#xff0c;比如白盒、黑盒、单元测试&#xff0c;相…

vue 入门环境搭建

公司项目要用vue.js来开发&#xff0c;要使用vue来开发前端框架&#xff0c;首先要有环境&#xff0c;所以给大家介绍一下如何搭建vue环境。其实很简单&#xff1a; 1.首先下载安装node.js。 去官网https://nodejs.org/zh-cn/下载安装包。 2.安装webpack 打开cmd命令界面&#…

【解决】Win10修改host没有权限问题

Step1&#xff1a;右键文件选择属性&#xff0c;选择安全&#xff0c;点击编辑&#xff1a; Step2&#xff1a;在弹窗中点击添加&#xff0c;在弹窗中点击高级&#xff1a; Step3&#xff1a;在弹窗中点击立即查找&#xff0c;选中当前用户&#xff0c;点击确定&#xff1a; …

[已授权] 互联网定位技术小谈

​ 诚邀阿里云先知社区邀请&#xff0c;不胜感激&#xff01;今日小编在此为大家介绍一下互联网中所应用的定位技术。互联网的发展日新月异&#xff0c;技术迭代很快&#xff0c;各行各业的智慧在互联网这片蓝天下碰撞结晶&#xff0c;造福大众。今天要讲述的集中定位方式&…

Python的DataFrame切片大全(包含多重索引)

码字不易&#xff0c;喜欢请点赞&#xff01;&#xff01;&#xff01; 摘要 这篇主要讲解如何对pandas的DataFrame进行切片&#xff0c;包括取某行、某列、某几行、某几列、以及多重索引的取数方法。 • 选取行名、列名、值 • 以标签&#xff08;行、列的名字&#xff09;…

什么是数据分析的关键指标?

什么是核心关键指标呢&#xff1f; 这是一个好问题&#xff0c;不过没有标准的答案。企业性质不同&#xff0c;所处行业、发展阶段不同&#xff0c;关注点当然不同。不过大体可以这样来划分。 1、发展阶段不同&#xff0c;需求不同 对于一个想要做数据化管理的企业来说&#xf…

加密函数

MD5&#xff1a;密码为web页面做准备&#xff0c;建议使用MD5 PASSWORD() :修改当前用户或其他用户密码 mysql> SELECT MD5(admin); #对admin进行MD5的加密&#xff08;32位&#xff09;----------------------------------| MD5(admin) |--------------------------------…

如何使用notepad运行python程序

关于使用notepad运行python程序 首先要确保python解释器已经安装成功,查看方法,windows可以在命令提示符中查看,通过按下winR键,调出运行窗口,在输入框中输入cmd回车,然后在命令行中输入python,若出现版本信息,例如Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC…

插入排序:表折半插入

在前一篇插入排序&#xff1a;表插入中。我们用静态链表的存储方式。直接插入的策略&#xff0c;构建了一种新的插入排序算法&#xff1a;表插入。有人可能会想到&#xff1a;相同是静态链表的形式&#xff0c;为什么不使用更高效的折半插入策略呢&#xff1f;这样的想法真的非…

【机器学习】sklearn实现---归类为5大类

sklearn实现---归类为5大类 sklearn.preprocessing.scale()&#xff08;最常用&#xff0c;易受异常值影响&#xff09;sklearn.preprocessing.StandardScaler()sklearn.preprocessing.minmax_scale()&#xff08;一般缩放到[0,1]之间&#xff0c;若新数据集最大最小值范围有变…

Kafka官方文档翻译——实现

IMPLEMENTATION 1. API Design Producer APIs Producer API封装了底层两个Producer&#xff1a; kafka.producer.SyncProducerkafka.producer.async.AsyncProducerclass Producer {/* Sends the data, partitioned by key to the topic using either the *//* synchronous or t…

【机器学习】熵、决策树、随机森林 总结

一、熵 公式&#xff1a; −∑i1np(xi)∗log2p(xi)-\sum_{i 1}^{n}{p(xi)*log_2p(xi)}−i1∑n​p(xi)∗log2​p(xi) ∑i1np(xi)∗log21p(xi)\sum_{i1}^{n}p(xi)*log_2\frac{1}{p(xi)}i1∑n​p(xi)∗log2​p(xi)1​ import numpy as np# 账号是否真实&#xff1a;3no&#xff…

HDU 4857 逃生(拓扑排序)

拓扑排序 一.定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序&#xff0c;是将G中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点u和v&#xff0c;若<u&#xff0c;v> ∈E(G)&#xff0c;则u在线性序列中出现在v之前。 通常&#xff0c;…

关于deepin系统安装design compiler的问题解答

关于deepin系统安装design compiler的问题解答 Design Compiler是Synopsys综合软件的核心产品。它提供约束驱动时序最优化&#xff0c;并支持众多的设计类型&#xff0c;把设计者的HDL描述综合成与工艺相关的门级设计&#xff1b;它能够从速度、面积和功耗等方面来优化组合电…

【机器学习】交叉验证筛选参数K值和weight

交叉验证 导包 import numpy as npfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn import datasets#model_selection &#xff1a;模型选择 # cross_val_score: 交叉 &#xff0c;validation&#xff1a;验证&#xff08;测试&#xff09; #交叉验证 from s…