本地向量存储于单台机器,其拥有 integer 类型的行,从 0 开始的索引,和 double 类型的值。
<br/>
MLlib 支持两种类型的本地向量:密集向量(dense)和稀疏向量(sparse)。
密集向量由一个浮点数数组组成,如`(2.1,3.2,4.3)`;而一个稀疏向量由索引和一个浮点向量组成,如`(3,[0, 2],[5.6, 4.3])`代表一个稀疏向量。
<br/>
本地向量的基类是 Vector,并且它有两个实现:DenseVector 和 SparseVector。
```scala
sealed trait Vector extends scala.AnyRef with scala.Serializable
class DenseVector ... extends scala.AnyRef with org.apache.spark.mllib.linalg.Vector
class SparseVector ... extends scala.AnyRef with org.apache.spark.mllib.linalg.Vector
```
<br/>
```scala
import org.apache.spark.mllib.linalg.{Vector, Vectors, DenseVector, SparseVector}
object LocalVector {
def main(args: Array[String]): Unit = {
// 创建密集向量 (1.0,0.0,3.0)
val dv: Vector = Vectors.dense(1.0, 0.0, 3.0)
println(dv) // [1.0,0.0,3.0]
// 使用数组创建稀疏向量
// def sparse(size : scala.Int, indices : scala.Array[scala.Int], values : scala.Array[scala.Double])
// size: 元素个数
// indices: 元素索引
// values: 元素值
val sv1: Vector = Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0))
println(sv1) // (3,[0,2],[1.0,3.0])
// 使用序列创建稀疏向量
val sv2: Vector = Vectors.sparse(3, Seq((0, 1.0), (2, 3.0)))
println(sv2) // (3,[0,2],[1.0,3.0])
// 稀疏向量转密集向量
val dv2: DenseVector = sv1.toDense
println(dv2) // [1.0,0.0,3.0]
// 密集向量转稀疏向量
val sv3: SparseVector = dv2.toSparse
println(sv3) // (3,[0,2],[1.0,3.0])
}
}
```