У меня есть код на python, и сейчас я пытаюсь написать его на c (для оптимизации скорости), потому что я никогда не использовал c!
Ранее я использовал для сохранения полученных данных в словаре или в списке массивов, но я не знаю, какова подходящая структура и как хранить ее здесь в c.
Я читаю данные из файла, называемого (попытка), затем обрабатываю их, используя функции, написанные в коде. Три for loops
используются для получения необходимых данных, но я не знаю, как их хранить!
код, который содержит петли
for (i=0; i<m; i++){
igraph_edge(&graph, i, &from, &to);
igraph_neighbors(&graph, &v1, from, IGRAPH_ALL);
igraph_neighbors(&graph, &v2, to, IGRAPH_ALL);
for (j=0; j < igraph_vector_size(&v2); j++) {
for (k=0; k < igraph_vector_size(&v1); k++) {
printf("%li %d %f %d %f\n", i, from, VECTOR(v1)[k] ,to, VECTOR(v2)[j]);
}
}
}
//EDIT: concerning the different data types, at the end all elements inside the loops could have have the same type so
int n1, n2;
for (i=0; i<m; i++){
igraph_edge(&graph, i, &from, &to);
igraph_neighbors(&graph, &v1, from, IGRAPH_ALL);
igraph_neighbors(&graph, &v2, to, IGRAPH_ALL);
for (j=0; j < igraph_vector_size(&v2); j++) {
for (k=0; k < igraph_vector_size(&v1); k++) {
n1 = floor(VECTOR(v1)[k]);
n2 = floor(VECTOR(v2)[j]);
printf("%li %d %d %d %d\n", i, from, n1 ,to, n2);
}
}
}
Результат находится на форме
0 1 2.000000 2 1.000000
0 1 2.000000 2 3.000000
0 1 2.000000 2 4.000000
1 2 1.000000 3 2.000000
1 2 3.000000 3 2.000000
1 2 4.000000 3 2.000000
.
.
.
Вместо того, чтобы печатать эти данные, я хотел бы сохранить их как
data = [ [ [1, 2.000000, 2 ,1.000000], [1, 2.000000, 2, 3.000000], [1, 2.000000, 2, 4.000000] ], [ [2, 1.000000, 3, 2.000000], [2, 3.000000, 3, 2.000000], ... ], ... ]
Тогда, если мне нужно получить доступ к данным
для индекса 0, data[0]= [ [1, 2.000000, 2 1.000000], [1, 2.000000, 2, 3.000000], [1, 2.000000, 2, 4.000000] ]
и data[0][2]=[1 2.000000 2 4.000000]
- и
data[0][2][3]= [4.000000]
data[0][2][3]= 4.000000
Возможно ли это в моем случае? Я был бы очень очень благодарен за любую помощь.
П.С .: Я буду очень рад объяснить что-то непонятное.
Сложение
Вот полный код (при необходимости)
#include <igraph/igraph.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define sigma 1
void print_vector(igraph_vector_t *v, FILE *file) {
long int i;
for (i=0; i < igraph_vector_size(v); i++) {
fprintf(file, "%li \n", (long int) VECTOR(*v)[i]);
}
fprintf(file,"\n");
}
float rbf(int a, int b);
float rbf(int a, int b) {
double inverse;
double exp(double x;);
double x;
double result;
inverse = ( 1/(sigma*sigma) );
x = (- inverse * ( (a - b)*(a - b) ) );
result = exp(x);
return (result);
}
int main(void)
{
igraph_t graph;
igraph_bool_t false;
igraph_bool_t connected1, connected2, connected3, connected4, connected5, connected6;
int ret;
float rhs1;
float rhs2;
igraph_vector_t v1, v2;
long int i, j, k, n, m ;
igraph_integer_t from, to;
igraph_adjlist_t adjlist;
FILE *file;
file = fopen("attempt", "r");
if(!file){
return 1;
}
igraph_read_graph_edgelist(&graph, file,
0, false);
fclose(file);
igraph_vector_init(&v1, (igraph_vcount(&graph)) );
igraph_vector_init(&v2, (igraph_vcount(&graph)) );
igraph_adjlist_init(&graph, &adjlist, IGRAPH_ALL);
n = igraph_vcount(&graph);
m = igraph_ecount(&graph);
for (i=0; i<m; i++){
igraph_edge(&graph, i, &from, &to);
igraph_neighbors(&graph, &v1, from, IGRAPH_ALL);
igraph_neighbors(&graph, &v2, to, IGRAPH_ALL);
for (j=0; j < igraph_vector_size(&v2); j++) {
for (k=0; k < igraph_vector_size(&v1); k++) {
printf("%li %d %f %d %f\n", i, from, VECTOR(v1)[k] ,to, VECTOR(v2)[j]);
}
}
}
//igraph_destroy(&graph);
}
и попытка файла содержит эти пробные данные
1 2
2 3
2 4
3 4
4 5