Ich habe einige Matlab-Code, der viele Millionen Male wie in dieser Frage erwähnt: Matlab: Does calling the same mex function repeatedly from a loop incur too much overhead?C und Matlab: Warum wird diese eine Zeile in Matlab so viele Zeilen in C++ - Code, generiert von Matlab Coder?
Ich versuche, mex-ify es zu sehen, ob das hilft. Wenn ich jetzt Code aus dem Matlab-Code unter Verwendung des Matlab Coder-Tools erzeuge, ist der Code im Allgemeinen vernünftig, aber diese eine Zeile Matlab-Code (in einem C++ - Kommentar in der ersten Zeile) erzeugt diese Monstrosität, und ich habe keine Ahnung warum. Jede Hilfe beim Verstehen und Reduzieren ihrer Komplexität wäre willkommen.
Für den Kontext ist d eine zweidimensionale Matrix und s1 ist ein Zeilenvektor. s1_idx zugeordnet Länge sein (s1) + 1 in der vorangehenden C++ Code,
/* d(:, 1) = 0:length(s1); */
cdiff = s1_idx_0 - 1;
for (nm1d2 = 0; nm1d2 <= cdiff; nm1d2++) {
tmp_data[nm1d2] = nm1d2;
}
ndbl = (int32_T)muDoubleScalarFloor((real_T)s1_sizes[1] + 0.5);
apnd = ndbl;
cdiff = ndbl - s1_sizes[1];
if (muDoubleScalarAbs((real_T)cdiff) < 4.4408920985006262E-16 * (real_T)s1_sizes[1]) {
ndbl++;
apnd = s1_sizes[1];
} else if (cdiff > 0) {
apnd = ndbl - 1;
} else {
ndbl++;
}
if (ndbl > 0) {
b_tmp_data[0] = 0.0;
if (ndbl > 1) {
b_tmp_data[ndbl - 1] = (real_T)apnd;
nm1 = ndbl - 1;
nm1d2 = nm1;
nm1d2 = (int32_T)((uint32_T)nm1d2 >> 1);
for (cdiff = 1; cdiff <= nm1d2 - 1; cdiff++) {
b_tmp_data[cdiff] = (real_T)cdiff;
b_tmp_data[(ndbl - cdiff) - 1] = (real_T)(apnd - cdiff);
}
if (nm1d2 << 1 == nm1) {
b_tmp_data[nm1d2] = (real_T)apnd/2.0;
} else {
b_tmp_data[nm1d2] = (real_T)nm1d2;
b_tmp_data[nm1d2 + 1] = (real_T)(apnd - nm1d2);
}
}
}
cdiff = s1_idx_0 - 1;
for (nm1d2 = 0; nm1d2 <= cdiff; nm1d2++) {
SD->f0.d_data[tmp_data[nm1d2]] = b_tmp_data[nm1d2];
}
Warum implementieren Sie es nicht in der mex-Datei selbst? Das scheint eine ziemlich einfache Funktion zu sein. Es scheint mir, dass MATLAB explizit die Indizes 'd (:, 1)' und den '1: length (s1)' Vektor erzeugt, um sie in der letzten Schleife 'SD-> f0.d_data = ...' in der Ende. Wenn das, was Sie berechnen, die erste kommentierte Zeile ist, können Sie alles in einer einzigen Schleife schreiben. – angainor
Ich würde es gerne direkt in C++ machen, anstatt automatisch generierten Code zu vertrauen, aber ich tue dies für einen Kunden, der nur Matlab kennt und den Code selbst später pflegen möchte, nachdem unser Vertrag beendet wurde . Daher muss man sich auf Matlab Coder verlassen. – sundar