Annodare sugli elementi non nulli di una matrice sparsa uBLAS
-
22-09-2019 - |
Domanda
ho il seguente matrice sparsa che contiene gli elementi O(N)
boost::numeric::ublas::compressed_matrix<int> adjacency (N, N);
Potrei scrivere una forza bruta doppio anello di andare oltre tutte le voci in tempo O(N^2)
come qui di seguito, ma questo sta per essere troppo lento.
for(int i=0; i<N; ++i)
for(int j=0; j<N; ++j)
std::cout << adjacency(i,j) std::endl;
Come posso ciclo su solo le voci non-zero in tempo O(N)
? Per ogni elemento diverso da zero desidero avere accesso al suo valore, e gli indici i,j
.
Soluzione
È possibile trovare la risposta in questa FAQ: Come iterare su tutti gli zero elementi non?
Nel tuo caso sarebbe:
typedef boost::numeric::ublas::compressed_matrix<int>::iterator1 it1_t;
typedef boost::numeric::ublas::compressed_matrix<int>::iterator2 it2_t;
for (it1_t it1 = adjacency.begin1(); it1 != adjacency.end1(); it1++)
{
for (it2_t it2 = it1.begin(); it2 != it1.end(); it2++)
{
std::cout << "(" << it2.index1() << "," << it2.index2() << ") = ";
std::cout << *it2 << std::endl;
}
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow