DMUG-Archiv 2001

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Lesen binärer Zahlen

> Gibt es eine Möglichkeit, dies zu beschleunigen?

Ja, mit einem MathLink-Programm. Üblicherweise lassen sich binär
geschriebene Fortran-Daten auch von einem C-Programm prima lesen,
damit erspart man sich Mixed-Language Programmierung.

Unten angehängt als Beispiel eine Abwandlung von einem Code, den
ich mir mal zu so einem Zweck geschrieben habe. Kompilieren mit
mcc, in Mma mit Install["ReadData"] laden.

Gruß,

Thomas Hahn

---------------------------snip------------------------------

:Begin:
:Function:      readdata
:Pattern:       ReadData[filename_String]
:Arguments:     {filename}
:ArgumentTypes: {String}
:ReturnType:    Manual
:End:

:Evaluate:      ReadData::noopen = "Cannot open `1`."

void readdata(const char *filename)
{
  FILE *file;
  double row[100];
  int ndata, i;

  file = fopen(filename, "r");
  if(file == NULL) {
    MLPutFunction(stdlink, "CompoundExpression", 2);
    MLPutFunction(stdlink, "Message", 2);
    MLPutFunction(stdlink, "MessageName", 2);
    MLPutSymbol(stdlink, "ReadData");
    MLPutString(stdlink, "noopen");
    MLPutString(stdlink, filename);
    MLPutSymbol(stdlink, "$Failed");
    return;
  }

  MLPutFunction(stdlink, "Flatten", 1);
  while(!feof(file)) {
    ... hier die Daten eines Records ins Array row einlesen ...
    ndata = (Anzahl der Daten in row);

    MLPutFunction(stdlink, "List", 2);
    MLPutFunction(stdlink, "Data", ndata);
    for(i = 0; i < ndata; ++i) MLPutDouble(stdlink, row[i]);
  }
  MLPutFunction(stdlink, "List", 0);
  MLEndPacket(stdlink);
}

main(int argc, char **argv)
{
  return MLMain(argc, argv);
}


Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html