kaldi中的Vector和Matrix

  • Post author:
  • Post category:其他


kaldi中的Vector和Matrix

Vector和Matrix是kaldi中最常用的数据类型之一。语音数据,提取的特征,计算的结果,都保存在Vector或者Matrix之中。按照字面意思,Vector是“向量”,它只有一行数据,是一维的。Matrix是“矩阵”,它有行与列两个维度。kaldi中的Vector和Matrix,可以做许多数学上的操作。比如点加或点乘(每个元素都加上一个数,或者乘以一个数),比如矩阵之间的乘法和矩阵的奇异分解等。kaldi中Vector和Matrix还可以做一些特殊操作,比如对每个元素取对数,对所有元素做softmax等。



一、首先介绍下Vector。



在matrix/kaldi-vector.h中,定义了三个类:VectorBase、Vector和SubVector。其中,VectorBase是基类(父类),Vector和SubVector是派生类(子类)。VectorBase中的成员函数已经可以完成一个向量类的所有操作了,Vector类只是做了封装,定义了多种形式的构造函数,增加了resize操作等。

VectorBase类中的数据成员十分简单,就两个成员。一个指针data_指向存放数据的内存,一个整数dim_指示元素的个数。

VectorBase中的函数成员比较多,但基本可以分为两类。一类是基本的、简单的操作。例如SetZero函数,用以设置全部数据为0;例如max函数,返回向量中的最大值。另一类是偏应用的函数或操作。比如,ApplySoftMax函数,提供softmax操作;比如Norm函数,计算范数。

下面的代码,有利于理解VectorBase的各种性质。注意,为了方面阅读和理解,对源代码做了修改。

template<typename Real>
class VectorBase {
  // *******数据成员,data_表示内存地址,dim_表示元素个数*******
  Real* data_;
  MatrixIndexT dim_;
  explicit VectorBase(): data_(NULL), dim_(0) { }
  
  // **************第一类,比较基础和简单的函数*******************
  // set类函数,设置全部值为0、特定值或者某种分布的随机值
  void SetZero();
  void Set(Real f);
  void SetRandn();
  void SetRandUniform();

  // 返回元素个数dim_,返回元素地址data_,返回占用内存大小,重载()操作等
  inline MatrixIndexT Dim() const { return dim_; }
  inline Real* Data() { return data_; }
  inline MatrixIndexT SizeInBytes() const { return (dim_*sizeof(Real)); }
  inline Real operator() (MatrixIndexT i) const { return *(data_ + i);  }
  inline Real & operator() (MatrixIndexT i) {   return *(data_ + i);  }
  Real Max() const;
  Real Min() const;
  Real Sum() const;
  Real SumLog() const;
  
  // 拷贝向量或者矩阵(全部或者局部,例如一行)的内容,来作为data_
  void CopyFromVec(const VectorBase<Real> &v);
  void 



版权声明:本文为u013677156原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。