2013-02-26 2 views
0

J'ai essayé de copier les indices de ligne, les index de colonne et les valeurs d'une matrice COO dans des vecteurs de poussée distincts, mais je trouve que je suis incapable de fais-le.Comment copier les lignes_indices d'une matrice COO à un vecteur de poussée dans CUSP

est Ci-dessous le code

cusp::coo_matrix <unsigned int, float, cusp::device_memory> *sim_mat; 
    sim_mat = new cusp::coo_matrix <unsigned int, float, cusp::device_memory>; 
    /* Code to fill up sim_mat: runs fine 
    ... 
    */ 
    { 
     thrust::device_ptr <unsigned int> d_rows = &((sim_mat->row_indices)); 
     thrust::device_ptr <unsigned int> d_cols = &((sim_mat->column_indices)[0]); 
     thrust::device_ptr <float>  d_vals = &((sim_mat->values)[0]); 
     unsigned int size_nn = (sim_mat->row_indices).size(); 
     thrust::device_vector <unsigned int> d_Rows; 
     thrust::device_vector <float>  d_Vals; 
     thrust::device_vector <unsigned int> reduced_Rows; 

     // Code fails below this point 
     thrust::copy_n (d_rows, size_nn, d_Rows.begin()); 
     thrust::copy_n (d_vals, size_nn, d_Vals.begin()); 
     cout << size_nn << std::endl; 

     if (!(sim_mat->is_sorted_by_row())) 
      thrust::sort_by_key(d_Rows.begin(), d_Rows.end(), d_Vals.begin()); 
     thrust::reduce_by_key(d_Rows.begin(), d_Rows.end(), d_Vals.begin(), reduced_Rows.begin(), sim_row->begin()); 

    } 

Ithe sim_row est un pointeur de vecteur de poussée qui a été alloué la mémoire dans un code précédent et ne sont pas pertinentes.

Le code compile, mais échoue au moment de l'exécution avec l'erreur:

terminate called after throwing an instance of 'thrust::system::system_error' what(): invalid argument Aborted (core dumped)

Quelqu'un pourrait-il me dire ce que je fais mal?

Merci Akshay

+0

Votre méthode d'affectation 'd_rows',' d_cols' et ' d_vals' est très mauvais. – talonmies

Répondre

2

Il y a plusieurs erreurs dans votre codage. Comme indiqué précédemment, votre méthode d'accès aux index de ligne, aux index de colonne et aux valeurs de la matrice de coo ne fonctionnera pas. En outre, vous ne pouvez pas créer de vecteurs de poussée tels que d_Rows, d_Vals de taille nulle, puis leur copier d'autres vecteurs.

le code suivant fonctionne pour moi et illustre une façon d'extraire les indices de lignes, des indices de colonne et des valeurs dans des vecteurs de poussée séparés:

#include <stdio.h> 
#include <cusp/verify.h> 
#include <cusp/array2d.h> 
#include <cusp/coo_matrix.h> 
#include <thrust/host_vector.h> 
#include <thrust/device_vector.h> 

int main() 
{ 
    typedef cusp::device_memory MemorySpace; 
    // initial matrix 

    cusp::array2d<float, MemorySpace> E(4, 3); 
    E(0,0) = 1.000e+00; E(0,1) = 0.000e+00; E(0,2) = 0.000e+00; 
    E(1,0) = 0.000e+00; E(1,1) = 1.050e+01; E(1,2) = 0.000e+00; 
    E(2,0) = 0.000e+00; E(2,1) = 0.000e+00; E(2,2) = 2.500e-01; 
    E(3,0) = 0.000e+00; E(3,1) = 2.505e+02; E(3,2) = 0.000e+00; 

    cusp::coo_matrix<int, float, MemorySpace> coo(E); 

    if (!cusp::is_valid_matrix(coo)) {printf("Invalid COO\n"); return 1;} 

    thrust::device_vector<int> row_ind(coo.row_indices.size()); 
    thrust::device_vector<int> col_ind(coo.column_indices.size()); 
    thrust::device_vector<float> values(coo.values.size()); 

    thrust::copy(coo.row_indices.begin(), coo.row_indices.end(), row_ind.begin()); 
    thrust::copy(coo.column_indices.begin(), coo.column_indices.end(), col_ind.begin()); 
    thrust::copy(coo.values.begin(), coo.values.end(), values.begin()); 

    thrust::host_vector<int> h_row_ind = row_ind; 
    thrust::host_vector<int> h_col_ind = col_ind; 
    thrust::host_vector<float> h_values = values; 

    printf("COO row indices: \n"); 
    for (int i = 0; i < h_row_ind.size(); i++) 
    printf("%d \n", h_row_ind[i]); 


    printf("COO column indices: \n"); 
    for (int i = 0; i < h_col_ind.size(); i++) 
    printf("%d \n", h_col_ind[i]); 


    printf("COO values: \n"); 
    for (int i = 0; i < h_values.size(); i++) 
    printf("%f \n", h_values[i]); 

    return 0; 
} 
Questions connexes