ich mit 2D-Arrays arbeite mit Doppelzeiger definiert, e.g,Rückdoppelzeiger 2D-Matrix in mex Funktion
double** array;
array = (double**) calloc(numRows, sizeof(double*));
for (int i = 0; i < numRows; i++)
{
array[i] = (double*) calloc(numCols, sizeof(double));
/* then array[i][j] = values */
}
// code to return matlab array
plhs[0] = mxCreateDoubleMatrix(numRows, numCols, mxREAL);
// memory copy
// ?????????
for (i = 0; i < numRows; i++){
free(array[i]);
}
free(array);
I array
in Matlab zurückkehren möchten. Eine Ausführungs ich für den // memory copy
Teil bis jetzt habe, und ich denke, dass es in Ordnung ist, korrigieren bitte ich bin:
stacked1D = mxGetPr(plhs[0]);
int n = 0;
for (int r = 0; r < max_degree; r++)
for (int c = 0; c < n_vars; c++)
stacked1D[n++] = stacked2D[r][c];
Ich frage mich, mich, ob wir es mit einer mem-copy
Funktion wie diese mxSetPr(OUT, *stacked2D);
tun können, was nicht funktioniert in dieser Syntax.
Könnten Sie bitte einen Tipp-Erklärung oder mögliche Antwort geben?
Erstens gibt es keine Notwendigkeit zu verwenden 'calloc' in ein C++ Programm. Wenn Sie Speicher dynamisch zuweisen möchten, verwenden Sie 'new []'. Zweitens, [siehe diese Antwort] (http://stackoverflow.com/questions/23458486/delete-2d-array-c/23458646#23458646), wie Sie ein 2D-Array effizienter zuweisen, wo Sie den gesamten Speicherpool zuweisen statt in Blöcken, wie es dein Code jetzt macht. – PaulMcKenzie
@PaulMcKenzie Ehrfürchtige Verbindung. Es kam mir nie in den Sinn, dass du es so machen könntest. – NathanOliver
Was den memcpy-Teil betrifft, müssen Sie immer noch das Array zuweisen (mit der Methode, bei der Sie nur zwei Aufrufe von 'new []' brauchen), aber um die Daten zu kopieren, benötigen Sie einen einzelnen 'memcpy' von der Quelle zu Zielpool. Wenn Sie bei Ihrer Methode bleiben, brauchen Sie eine Schleife, die 'memcpy'' n' für eine 'n x n'-Matrix aufruft. – PaulMcKenzie