目的

(CSC)的目的是为了压缩矩阵,减少矩阵存储所占用的空间。这很好理解,手法无非就是通过增加一些”元信息”来描述矩阵中的非零元素存储的位置(基于列),然后结合非零元素的值来表示矩阵。这样在一些场景下可以减少矩阵存储的空间。

Spark API

在Spark中我们一般创建这样的稀疏矩阵的API为:

org..spark.ml.

/**

* a -major in (CSC) .

* @param of rows

* @param of

* @param the index to the start of a new

* @param the row index of the entry

* @param non-zero in major

*/

@Since(“2.0.0”)

def (

: Int,

: Int,

: Array[Int],

: Array[Int],

: Array[]): = {

new (, , , , )

使用CSC格式表示稀疏矩阵

例如我们想创建一下如下的3×3的稀疏矩阵:

1 0 4

0 3 5

2 0 6

我们就可以使用上面的这个api:

org..spark.ml..{,}

val sm: = .(3,3, Array(0,2,3,6), Array(0,2,1,0,1,2), Array(1.0,2.0,3.0,4.0,5.0,6.0))

输出如下:

sm: org..spark.ml.. = 3 x 3

(0,0) 1.0

(2,0) 2.0

(1,1) 3.0

(0,2) 4.0

(1,2) 5.0

(2,2) 6.0

也就是说上面的3×3的矩阵,可以表示为下面3个数组:

Array(0, 2, 3, 6)

Array(0, 2, 1, 0, 1, 2)

Array(1, 2, 3, 4, 5, 6)

说实话我第一次看到这个api的时候有点蒙。下面因为没太看懂上面三个Array中的第一个Array(0, 2, 3, 6)是怎么的出来的。也翻看了比较权威的资料(本文最下方的参考资料),但是感觉说的比较不清楚,因此下面谈谈我是如何理解的。

我的理解

上面的3个Array:(为了便于书写我没有写1.0,而是直接写为1)

Array(0, 2, 3, 6)

Array(0, 2, 1, 0, 1, 2)

Array(1, 2, 3, 4, 5, 6)

其中第三个Array很好理解。它的值就是按照列,依次按照顺序记录的矩阵中的非零值。

第二个Array也比较好理解,他表示的是每一列,非零元素所在的行号,行号从0开始。比如上面的矩阵中,第一列元素1在第0行,元素2在第2行。

至于第1个Array理解起来稍微麻烦一些。我的总结就是:

上面的总结可能看起来比较模糊,根据上面的例子我来分析一下:

验证例子

对于下面的这个3×3的矩阵:

1 0 2

0 0 3

4 5 6

我们可以得到3个Array为:

Array(0, 2, 3, 6)

Array(0, 2, 2, 0, 1, 2)

Array(1, 4, 5, 2, 3, 6)

对于下面的矩阵:

9 0

0 8

0 6

我们可以得到3个Array来表示他:

Array(0, 1, 3)

Array(0, 1, 2)

Array(9, 8, 6)

对于下面的矩阵:

9 0 0 0

0 8 6 5

我们可以表示为:

Array(0, 1, 2, 3, 4)

Array(0, 1, 1, 1)

Array(9, 8, 6, 5)

根据CSC表示法,画出原始矩阵

上面展示了如何把稀疏矩阵使用CSC表示,那么反过来应该怎么操作呢,

假设有一个2×4的矩阵,他的CSC表示为:

Array(0, 1, 2, 3, 4)

Array(0, 1, 1, 1)

Array(9, 8, 6, 5)

我大致描述一下还原的过程:

参考资料

加入IP合伙人(站长加盟) | 全面包装你的品牌,搭建一个全自动交付的网赚资源独立站 | 晴天实测8个月运营已稳定月入3W+
限时特惠:本站每日持续更新海量内部创业教程,一年会员只需98元,全站资源免费无限制下载点击查看会员权益

站长微信: qtw123cn

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注