WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Vectoring mit Auswertung zweier benachbarter Elemente

 

Droke

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2020, 13:23     Titel: Vectoring mit Auswertung zweier benachbarter Elemente
  Antworten mit Zitat      
Hallöchen,
ich schreibe gerade einen Code, der verschiedene Arrays/CellArrays in denen jeweils 3-Dimensionale Punkte gespeichert sind, abfragt und zur Auswertung an eine Funktion übergibt.
Das ganze dauert ganz schön lange und ich habe mich gefragt, ob die vielen for-Schleifen vielleicht durch geschicktes Vectoring (zumindest einige davon) ersetzt werden könnten, um Rechenzeit zu sparen. Vielleicht gibt es dafür ja auch andere Tricks, die ich gerade nicht auf dem Schirm hab.
Ignoriert die Zeilen am Anfang, die die Variablen belegen. Die sind nur dafür da, damit ein lauffähiges Beispiel zustande kommt.

Bei i_cnt = 1 passieren einige besondere Dinge, deshalb habe ich den Fall schon mal rausgenommen. Der muss sowieso extra gerechnet werden. Ich finde für den Rest aber keine sinnvolle Lösung, so dass point1 und point2 immer zwei aufeinanderfolgende Zeile von points_a sind und ebenso point3 und point4 aufeinanderfolgende Felder von points_b.

Code:
i = randi(100);
j = randi(15);
k = j;
l = randi(50);
m = l;
p = l+1;
result_final = cell(1,i);
points_a = randi([-500,500],j*p,3);
points_b = cell(j*p,i);
for i_cnt = 2:1:i;
  for j_cnt = 1:1:j*p;
    points_b{i_cnt,j_cnt} = randi([-500,500],1,3);
  endfor;
endfor;


for i_cnt = 1:1:i;
  result = zeros(j,j);
 
  for j_cnt = 1:1:j;
    for m_cnt = 1:1:m;
      point1 = points_a(m_cnt+(j_cnt-1)*p,:)';
      point2 = points_a(m_cnt+(j_cnt-1)*p+1,:)';
     
      for k_cnt = 1:1:k;
        for l_cnt = 1:1:l;
          point3 = points_b{l_cnt+(k_cnt-1)*p,i_cnt}';
          point4 = points_b{l_cnt+(k_cnt-1)*p+1,i_cnt}';
                   
          result(j_cnt,k_cnt) = result(j_cnt,k_cnt) + foo(point1,point2,point3,point4);
        endfor;
      endfor;
    endfor;
  endfor;
 
  result_final{1,i_cnt} = result;
endfor;


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.11.2020, 13:55     Titel:
  Antworten mit Zitat      
Hallo,

Viel hängt davon ab, was foo ist und wie es arbeitet.

endfor ist nicht MATLAB. Nutzt du evtl. Octave? Ich kann mir gut vorstellen, dass allein das Verwenden von MATLAB statt Octave eine erhebliche Beschleunigung bringt.

Beispiel:
https://stackoverflow.com/questions.....loop-in-matlab-and-octave
Octave ist bei einer kleineren Aufgabe um größenordnungsmäßig Faktor 100 langsamer.

Je nach den Möglichkeiten von foo sollte es machbar sein, nur zwei Schleifen über j_cnt und k_cnt zu verwenden und dann jeweils nur eine vektorisierte Auswertung von foo, die mit sum aufsummiert wird.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Droke
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 25.11.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2020, 14:02     Titel:
  Antworten mit Zitat      
du hast recht, leider habe ich keine Matlab Lizenz zur Verfügung und nutze deshalb Octave.

In foo wird hauptsächlich die geometrische Lage der Geraden durch point1,point2 und point3,point4 ausgewertet und dann abhängig vom Ergebnis eine von mehreren Formeln berechnet (in die Formel gehen unter anderem Winkel und Länge der Geraden ein). Das Ergebnis geht dann in result ein.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.11.2020, 14:27     Titel:
  Antworten mit Zitat      
Hallo,

bist du Student? Viele Unis haben einen Rahmenvertrag mit MathWorks, so dass alle Studenten freien Zugang zu MATLAB haben. Wenn du mir schreibst, an welcher Uni du bist (gerne per PN), dann kann ich das prüfen. Ansonsten finde ich, dass die Investition für eine Studentenlizenz doch überschaubar ist.

Zitat:
In foo wird hauptsächlich die geometrische Lage der Geraden durch point1,point2 und point3,point4 ausgewertet und dann abhängig vom Ergebnis eine von mehreren Formeln berechnet (in die Formel gehen unter anderem Winkel und Länge der Geraden ein).

Daraus alleine kann ich nicht beurteilen, ob die Funktion vektorisierbar ist. Es ist aber gut möglich. Versuch den Vorschlag doch mal?
Wenn du dabei auf Probleme stößt, bitte den Inhalt von foo posten.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Droke
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 25.11.20
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.11.2020, 16:43     Titel:
  Antworten mit Zitat      
Nope, leider kein Student, sonst hätte ich das schon probiert Very Happy

Danke für die Idee, ich setz mich demnächst mal ran und schau, ob sich da was machen lässt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.11.2020, 17:07     Titel:
  Antworten mit Zitat      
Hallo,

für private Nutzung schau dir mal die Home Version an.
Für berufliche Zwecke würde ich wirklich empfehlen, sich MATLAB anzusehen. Wenn du das weiter verfolgen möchtest, schick mir gerne eine PN, wo du arbeitest.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.