【发布时间】:2011-11-07 15:53:38
【问题描述】:
我正在对日志域中的浮点稀疏矩阵进行一些计算,因此“空”条目实际上是 -Inf(使用 -FLT_MAX)。我现在正在使用自定义稀疏矩阵类,但我渴望更换现成的替代品。
这是用 C++ 编写的。我倾向于查看 Eigen 和 Boost uBlas 中的压缩列矩阵。但是,尚不清楚是否支持“零”的自定义值(可能由模板参数提供)。有人有什么建议吗?
澄清:
我想要的是:对于之前未“设置”的任何单元格 (i,j),我希望 mat[i,j] 返回 -Inf ...所以这可能更好地描述为稀疏矩阵的“空”条目的“默认”值。
我正在使用它来执行 HMM 递归(Viterbi,sum-product),并将概率保存在日志域中以避免下溢。
我没有做任何矩阵运算……本质上,我只是在填写动态规划表。我想使用稀疏矩阵类,因为我只填充矩阵的一个带,并且我希望有效地使用内存。压缩带矩阵将提供良好的性能,因为我正在“按顺序”填充矩阵。
【问题讨论】:
-
传统稀疏矩阵的“零”元素不被存储,也不用于任何数值计算。我了解
log(0) = -Inf,但我不明白您要做什么-如果您为所有零元素添加-FLT_MAX,您最终会得到一个密集矩阵,无论如何我看不出如何对涉及-Inf的矩阵进行数值运算是有意义的。也许我错过了重点? -
例如,
x * 0 == 0,但x * -Inf != -Inf当x为负数时(同样x + 0 == x,但x + -Inf != x)。因此,在进行稀疏矩阵乘法时,如果这些值为-Inf,则不能只忽略所谓的空值,而可以直接跳过一堆零。 -
我认为 OP 想要的是一个稀疏矩阵,其中零单元格实际上是其他值而不是零。所以不是大多数值为零的矩阵(所以它是稀疏的),大多数值是某个值 X(但相对于非 X 值仍然是稀疏的)。
-
你打算用你的矩阵做什么样的计算?
-
@David:提问者确实解释了 - 矩阵中的值是概率的对数,并且在乘法之前将被反对数。
-Inf用作log(0)的近似值。因此,稀疏的东西可能不需要矩阵算术(这在对数域 AFAIK 中没有意义),只需一个具有可调空值的稀疏二维数组即可。
标签: c++ math boost sparse-matrix eigen