Tipps zum effizienten und schnellen Löschen einer gegebenen Zeile/Spalte aus einer Matrix?Matrix-Zeilen/-Spalten effizient in MATLAB löschen
Ich hatte anfangs geglaubt, dass das Löschen der letzten Spalte einer gegebenen Matrix effizienter wäre als die erste Spalte, und alle Spaltenoperationen effizienter wären als Zeilenoperationen (MATLABs spaltenbasierter Speicher), was ich konnte Bestätigung durch Tests Allerdings war die Leistung, die ich bekam, ziemlich unglücklich.
someB = rand(4,50000);
someC = someB.';
tic
while size(someB,2) > 2
someB(:,size(someB,2)) = [];
end
toc
tic
while size(someC,1) > 2
someC(size(someC,1),:) = [];
end
toc
%Elapsed time is 13.869280 seconds.
%Elapsed time is 10.198270 seconds.
Ich habe eine schnelle Suche und in this MATLAB newsgroup discussion fand ich die Hoffnung, dass durch externe C-MEX-Funktionen gibt es in der Tat eine Art und Weise effizient die letzte Spalte einer Matrix schnell zu löschen sein. Der Code ist unten angehängt.
#include "mex.h"
// You may need to uncomment the next line
//#define mwSize int
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mwSize n;
if(n = mxGetN(prhs[0]))
mxSetN(prhs[0], n - 1);
}
Allerdings war ich nicht in der Lage an den Code zu bekommen, mich laufen. Wenn Sie sich die Ergebnisse, die der Autor gefunden hat, kurz ansehen, werden Sie bemerkenswerte Leistungen feststellen. Ich bin selbst nicht so gut in MEX; Würde jemand wissen, wie man obigen Code repariert, so dass er läuft, oder alternativ einen gleichwertigen/fast gleichwertigen MEX-Code/MATLAB-Code leistungsmäßig haben?
Danke!
Ja, die Leistung, die ich mit mxSetN erreichen wollte, war, dass diese letzte Spalte einfach ignoriert und effektiv gelöscht würde; Das scheint der Autor zu sein. Leider hat es an meinem Ende nicht geklappt. Letztendlich denke ich, dass der beste Weg dies zu tun ist, nur eine 'java.util.ArrayList' zu sein. – genap
Nun, Sie können diesen Ansatz mit mxSetN und das wird es tun. Es wird nicht gelöscht, bis das mxArray tatsächlich bereinigt wird, aber MATLAB behandelt das Array so, als ob es eine Spalte weniger hätte. Was hat nicht geklappt? Du hast gesagt, du könntest es nicht zum Laufen bringen - was war das Problem? – CKT