Verfasst am: 02.09.2015, 12:05
Titel: Optimierung Matrixoperation mit sich wiederholenden Werten
Hallo zusammen,
ich möchte folgendes Problem möglichst otimiert in Matlab lösen:
Auf eine große Matrix A soll exp() angewandt werden. exp() benötigt allerdings (nicht nur in Matlab) relativ viel Zeit. Die Einträge in A treten an mehren Stellen auf so dass sich das Problem folgendermaßen optimieren lässt:
Code:
% defintion of a grid
gridSp = 2:2:70;
X = repmat(gridSp,35,1);
Z = repmat(gridSp',1,35);
% calculation of the distances
locMat = [X(:) Z(:)];
dist = zeros(length(locMat));
% this could be optimised with p2dist, but I do not have the stats toolbox for i=1:length(locMat) for j=1:length(locMat)
dist(i,j) = sqrt((locMat(i,1)-locMat(j,1))^2 + (locMat(i,2)-locMat(j,2))^2);
end end
langsam. Sie erste Zeile ist langsamer als eine einfache Operation z.B. + auf einer Matrix mit der größe von A. Die Umwandlung nach sparse is notwendig, da im weiteren Code (hier nicht gezeigt) eine unvollständige Choleskyzerlegung (ichol()) durchgeführt wird. Hat jemand einen Tip, wie sich de Code optimieren ließe.
warum benutzt du da eine schleife wenn du eh nur den letzten durchgang als ergebniss behältst ? da kannst du auch gleich nur einmal mit j=100 rechnen. falls das nur ein fehler ist und du eigendlich alle b und A speicherst solltest du die vorher schonmal von der größe her anlegen wie du das auch schon mit dist gemacht hast.
anmerkung: j und i sind die imaginären einheiten und sollten nicht als variablen name verwendet werden. das kann zu verwirrungen führen.
grüße
_________________
Danke für den Vorschlag zum ersten Teil des Codes. Ich werde das gleich mal ändern.
Bzgl. Deiner Frage zur Schleife:
Ich habe hier den Code entschlakt und nur die Zeilen gepostet, die ich verbessern möchte um durch weitere Zeilen nicht zu verwirren. Im Original-Code wird A weiterverarbeitet. Der Vollständigkeit halber poste ich nochmal einen erweiterten Code, um zu zeigen, was mit A passiert. In meiner Anwendung läuft fie for-Schleife 4096 Iterationen und muss mehrere 1000 mal ausgeführt werden...
Code:
% defintion of a grid
gridSp = 5:5:35*5;
X = repmat(gridSp,35,1);
Z = repmat(gridSp',1,35);
% calculation of the distances
locMat = [X(:) Z(:)];
dist=sqrt(bsxfun(@minus,locMat(:,1),locMat(:,1)').^2 +... bsxfun(@minus,locMat(:,2),locMat(:,2)').^2);
for jj=1:100
b = exp(-8.8*uniqueDist*sqrt((freq(jj)/15).^2 + 10^-7));
b = b.*psdA(jj);
A = b(Locb);
droptol = max(A(:))*10^-10;
ifmin(A(:))<droptol
A = sparse(A);
HH_A = ichol(A,struct('type','ict','shape','lower','droptol',droptol));
else
HH_A = chol(A,'lower');
end
H_A(:,jj) = HH_A*nn_A(:,jj);
end
macht. aber nur minmal. viel zeit frist
chol
ich hab leider keine cuda karte sonst würde ich mal versuchen das aufm gpu zu machen aber ob da was bringt weis ich nicht. kenn mich damit zu wenig aus.
grüße
_________________
Nur eine Anmerkung, die aber in Deinem Fall die Laufzeit wohl kaum messbar verkürzen wird: 10^-7 ist eine teure Operation, während 1e-7 eine Konstante ist.
Wie Winkow schon erwähnt hat: Statt
exp
auf den gesamten Vektor anzuwenden und später nur mit
A=b(Locb)
ein paar davon zu verwenden, ist es sinnvoller, die teure
exp
Funktion nur auf die Zahlen anzuwenden, die auch verwendet werden.
Gruß, Jan
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.