2016-06-15 37 views
0

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!

Antwort

0

Nun, zum einen, die MEX-Lösung, die Sie gebucht haben, ist eigentlich nicht löschen die Spalte, so ist es nicht wirklich ein fairer Vergleich. Die Lösung, "mxSetN" zu verwenden, setzt nur den internen Header für das mxArray, um zu denken, dass es N Spalten hat. Aus der Dokumentation:

Normalerweise verwenden Sie mxSetN, um die Form eines vorhandenen mxArray zu ändern. Die Funktion "mxSetN" weist keinen Speicherplatz für die Arrays "pr", "pi", "ir" oder "jc" zu.

In Bezug auf die Timing-Ergebnisse, die Sie sehen, was passiert, wenn Sie diese mehrmals ausführen? Als ich das erste Mal lief, hatte ich ähnliche Ergebnisse wie bei Ihnen, aber beim zweiten Durchlauf waren die Timings für beide Methoden ähnlich.

Beachten Sie, dass Sie in jedem Fall eine große Speichermenge neu zuordnen müssen, da Sie nur 4 Elemente gleichzeitig löschen. Dies bedeutet, dass die früheren Schleifeniterationen mehr kosten als die späteren Iterationen.

Die große Frage hier ist, was Sie letztlich versuchen zu tun. Vielleicht können Sie die Löschung vermeiden und nur den Teil der Matrix verwenden, den Sie brauchen, oder vielleicht gibt es eine Möglichkeit, zu vermeiden, dass Sie bei jeder Iteration eine einzelne Spalte löschen müssen (und stattdessen mehrere Spalten verwenden).

+0

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

+0

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

Verwandte Themen