我正在使用bool的boost稀疏矩阵并尝试编写一个比较函数来将它们存储在地图中。这是一个非常简单的比较功能。基本上,这个想法是将矩阵视为二进制数(在被展平为向量之后)并根据该数字的值进行排序。这可以通过以下方式完成:
for(unsigned int j = 0; j < maxJ; j++)
{
for(unsigned int i = 0; i < maxI; i++)
{
if(matrix1(i,j) < matrix2(i,j) return true;
else if(matrix1(i,j) > matrix2(i,j) return false;
}
}
return false;
但是,由于矩阵的稀疏性,这是低效的,我想使用迭代器来获得相同的结果。使用迭代器的算法看起来很简单,即 1) 获取每个矩阵中的第一个非零单元,2) 比较两者的 j*maxJ+i,3) 如果相等,则获取每个矩阵中的下一个非零单元并重复。不幸的是,在代码中这是非常乏味的,我担心错误。
我想知道的是(a)是否有更好的方法来做到这一点,(b)是否有一种简单的方法可以为两个矩阵获取“下一个非零单元格”?显然,我不能使用嵌套的 for 循环来遍历一个稀疏矩阵。
谢谢你的帮助。
--
由于看起来我上面提出的算法可能是我特定应用程序中的最佳解决方案,我想我应该发布我为棘手部分开发的代码,在两个稀疏矩阵中获取下一个非零单元格。这段代码并不理想,也不是很清楚,但我不知道如何改进它。如果有人发现错误或知道如何改进它,我将不胜感激。否则,我希望这对其他人有用。
typedef boost::numeric::ublas::mapped_matrix<bool>::const_iterator1 iter1;
typedef boost::numeric::ublas::mapped_matrix<bool>::const_iterator2 iter2;
// Grabs the next nonzero cell in a sparse matrix after the cell pointed to by i1, i2.
std::pair<iter1, iter2> next_cell(iter1 i1, iter2 i2, iter1 end) const
{
if(i2 == i1.end())
{
if (i1 == end)
return std::pair<iter1, iter2>(i1, i2);
++i1;
i2 = i1.begin();
}
else
{
++i2;
}
for(; i1 != end;)
{
for(; i2 != i1.end(); ++i2)
{
return std::pair<iter1, iter2>(i1,i2);
}
++i1;
if(i1 != end) i2 = i1.begin();
}
return std::pair<iter1, iter2>(i1, i2);
}