2015-04-07 3 views
0

Я использую трубу позвонить Gnuplot непосредственно в C. Я открываю трубку с помощью:Как передать gnuplot матрицу в c?

#define GNUPLOT "gnuplot -persist" 
FILE *gp; 
gp = popen(GNUPLOT, "w"); 

Прямо сейчас, я хочу, чтобы передать матрицу, скажем, zvalue[][], чтобы GNUPLOT, так что я могу использовать следующую команду для построения графика 3D:

fprintf(gp, "splot zvalue matrix using 1:2:3\n"); 

мне удалось сделать это при использовании труб в C++:

#include "gnuplot-iostream.h" 

, который необходим для компиляции с помощью -lboost_iostreams -lboost_system -lboost_filesystem, и имеет функцию gp.fileld(zvalue), чтобы справиться с этим, а именно:

gp << "splot" << gp.file1d(zvalue) << "matrix using 1:2:3\n"; 

так, что Gnuplot может получить доступ к матрице zvalue.

Мой вопрос: есть ли подобная функция, используя трубы C?

+0

Отформатируйте свой код. – Falmarri

ответ

0

Вы должны использовать специальное имя файла - с splot, а затем записать данные матрицы к трубе:

#include <stdio.h> 

#define GNUPLOT "gnuplot -persist" 

int main(void) 
{ 
    FILE *gp = popen(GNUPLOT, "w"); 

    fprintf(gp, "splot '-' matrix using 1:2:3\n"); 
    int i, j; 
    for (i = 0; i < 10; i++) { 
     for (j = 0; j < 10; j++) 
      fprintf(gp, "%d ", i*j); 
     fprintf(gp, "\n"); 
    } 
    pclose(gp); 
    return 0; 
} 

Конечно, в вашем случае вы должны написать fprintf(gp, "%e ", zvalue[i][j]) или аналогичный.

+0

Спасибо за ответ, я думал так же, я просто надеюсь, что это будет проще, как на C++. И в вашем коде fprintf (gp, "\ n") следует изменить в fprintf (gp, "e"), правильно? – Robin

+0

Нет, печать новой строки верна. Это знаменует конец строки матрицы. В конце концов понадобится 'e', но поскольку труба закрыта после отправки всех данных, это необязательно. Но как просто вы ожидаете, что это станет? Просто инкапсулируйте это в короткую функцию, которая отправляет команду splot и матрицу по каналу. Я думаю, что это самый простой способ, без внешнего участия. – Christoph

+0

Просто убедитесь, что я могу следовать за тобой. В вашем коде вы заполняете матрицу, а линии splot zvalue w, используя 1: 2: 3, означают сетку x-y с zvalue в каждой точке (i, j)? Таким образом, я также могу использовать другой способ, то есть: splot '-' w lines, а затем ввести точку один за другим, на этот раз (i, j, z [i] [j]) и поместить 'e \ n' в конце? – Robin