我正在使用boost sparse矩陣來保存bool's並試圖編寫一個比較函數來將它們存儲在地圖中。這是一個非常簡單的比較功能。基本上,這個想法是將矩陣看作一個二進制數(在被平面化成一個向量之後)並根據該數值進行排序。這可以通過這種方式來完成:通過兩個稀疏矩陣迭代
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);
}
你爲什麼要比較bools和< and >?即使您可以相信false
Bill
我不想寫一個<操作符來比較單個布爾。我試圖將這些數據結構插入一個std :: map,它需要一個<運算符進行排序。 – RandomGuy
@scan:編輯我的答案 –