2013-03-27 17 views
5

Problem: Chcę utworzyć ważony nieukierunkowany wykres z macierzy sąsiedztwa przechowywany w pliku .csv przy użyciu funkcji igraph, a następnie wykonać minimalne drzewo opinające i kilka innych algorytmów .Tworzenie ważonego nieukierunkowanego wykresu w "igraph" w C/C++

Zacząłem od wykonania ukierunkowanego wykresu z 10 wierzchołkami i 5 krawędziami. Domyślnie igraph nie dopuszcza wag dla krawędzi i musisz użyć pewnych atrybutów, które nie mają dla mnie sensu (coś jak igraph_i_set_attribute_table) w dokumentacji.

Czy ktoś może mi pomóc w tej sprawie.

void print_vector(igraph_vector_t *v, FILE *f) { 
    long int i; 
    for (i=0; i<igraph_vector_size(v); i++) { 
    fprintf(f, " %li", (long int) VECTOR(*v)[i]); 
    } 
    fprintf(f, "\n"); 
} 

int main(int argc, char* argv[]) 
{ 
    igraph_t g; 
    igraph_vector_t v; 
    int ret; 
    igraph_es_t es; 

    /* Initialize the vector for edges */ 
    igraph_vector_init(&v,10); 

    VECTOR(v)[0]=0;VECTOR(v)[1]=1; 
    VECTOR(v)[2]=1;VECTOR(v)[3]=3; 
    VECTOR(v)[4]=1;VECTOR(v)[5]=5; 
    VECTOR(v)[6]=2;VECTOR(v)[7]=3; 
    VECTOR(v)[8]=2;VECTOR(v)[9]=5; 

    igraph_create(&g,&v,0,IGRAPH_DIRECTED); 

    print_vector(&v,stdout); 

    /* igraph_i_set_attribute_table(&igraph_cattribute_table); */ 

    igraph_vector_destroy(&v); 
    igraph_destroy(&g); 

    return 0; 
} 

Odpowiedz

3

Przede wszystkim, ogólnie rzecz biorąc, o wiele lepiej jest używać igraph z R lub Python, atrybuty są znacznie lepiej obsługiwane. Na przykład możesz łatwo wybrać wierzchołki lub krawędzie na podstawie wartości atrybutów itp. W języku C obsługa atrybutów jest minimalna, a w przypadku pracy z nimi jesteś w większości samodzielny. Tak więc, chyba że naprawdę potrzebujesz C, sugerowałbym użycie R lub Python.

Jeśli nadal chcesz C, a następnie pierwszą rzeczą, aby pamiętać, że trzeba to

igraph_i_set_attribute_table(&igraph_cattribute_table); 

w kodzie, zanim zrobisz cokolwiek z atrybutem jawnie lub niejawnie. To znaczy. nawet jeśli nie manipulujesz atrybutami jawnie, ale utworzysz wykres, który może mieć pewne atrybuty, np. odczytać wykres pliku GraphML, potrzebujesz tego połączenia wcześniej, w przeciwnym razie atrybuty zostaną usunięte. Najlepiej włączyć wywołanie na początku swojej funkcji main().

To nieprawda, że ​​musisz używać dowolnych atrybutów, nie jestem pewien, co przez to rozumiesz.

chodzi o ustawienie i odpytywanie atrybuty, zobaczyć pliki w katalogu examples/simple:

https://github.com/igraph/igraph/blob/master/examples/simple/cattributes.c https://github.com/igraph/igraph/blob/master/examples/simple/cattributes2.c https://github.com/igraph/igraph/blob/master/examples/simple/cattributes3.c https://github.com/igraph/igraph/blob/master/examples/simple/cattributes4.c

Przykłady te są w dużej mierze sztuczny, ponieważ są one wykorzystywane głównie do celów testowych, ale pokazują podstawowe użycie.

+0

To było bardzo pomocne @Gabor. Dziękuję Ci bardzo. – NightFox

Powiązane problemy