ブール値を保持するブースト スパース マトリックスを使用し、それらをマップに格納するための比較関数を作成しようとしています。とてもシンプルな比較機能です。基本的には、マトリックスを 2 進数 (ベクトルにフラット化した後) として見て、その数値の値に基づいて並べ替えるという考え方です。これは次の方法で実現できます。
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)両方の行列の「次のゼロ以外のセル」を取得する簡単な方法はありますか? 明らかに、1 つの疎行列を反復処理する場合のように、ネストされた for ループを使用することはできません。
ご協力いただきありがとうございます。
--
上記で提案したアルゴリズムが私の特定のアプリケーションで最適なソリューションであると思われるので、2 つのスパース行列で次の非ゼロ セルを取得する、トリッキーな部分のために開発したコードを投稿する必要があると考えました。このコードは理想的ではなく、あまり明確ではありませんが、改善方法がわかりません。誰かがバグを見つけた場合、またはそれを改善する方法を知っている場合は、コメントをいただければ幸いです。そうでなければ、これが他の誰かに役立つことを願っています。
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);
}