cur_sum.AddRowSumMat(1.0, input_part , 0.0); // input 列求和得到cur_sum
cur_sumsq.AddDiagMat2(1.0, input_part, kTrans, 0.0); //Add the diagonal of a matrix times itself *this = diag(M^T M) + beta * *this (if trans == kTrans).
variance.Scale(1.0 / window_frames); // E(x**2)
variance.AddVec2(-1.0 / (window_frames * window_frames), cur_sum); // E(x**2)- (E(x) /n)**2 得到方差
Add vector : *this = *this + alpha * rv^2 [element-wise squaring].
variance.ApplyPow(-0.5); // get inverse standard deviation. 标准差的倒数
output_frame.MulElements(variance); (x-E(x))/delta 得到 标准差归一化
Vector<double> variance(cur_sumsq); kaldi向量
variance.Scale(1.0 / window_frames); 乘系数
variance.ApplyPow(-0.5); // get inverse standard deviation. // 幂运算
double Plda::TransformIvector(const PldaConfig &config,
const VectorBase<double> &ivector,
int32 num_examples,
VectorBase<double> *transformed_ivector) const {
double normalization_factor;
transformed_ivector->CopyFromVec(offset_);
transformed_ivector->AddMatVec(1.0, transform_, kNoTrans, ivector, 1.0);
if (config.simple_length_norm)
normalization_factor = sqrt(transformed_ivector->Dim())
/ transformed_ivector->Norm(2.0);
else
normalization_factor = GetNormalizationFactor(*transformed_ivector,
num_examples);
if (config.normalize_length)
transformed_ivector->Scale(normalization_factor);
return normalization_factor;