Verfasst am: 26.10.2021, 14:31
Titel: 3D Matrix klassifizieren
Hi Leute,
ich hoffe, es geht Euch gut. Ich will aus einer 3D-Matrix Werte kleiner x heraussuchen was auch klappt mit ind2sub. Dann möchte ich einen neuen Wert in meinem Fall 0.1 in eine neue 3D Matrix schreiben ... das klappt auch dauert aber extrem lange, hat jemand eine Idee wie das schneller geht ... ???
VG han
wie sind die Dimensionen der Arrays? Was bedeutet "extrem lang"?
Bist du dir sicher, dass die Werte an die richtigen Stellen geschrieben werden? Ich verstehe das an sich so:
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 ;)
vielen vielen Dank für Deine schnelle Antwort!!!
Ich hatte ich wirklich mit Hilfe gerechnet daher war meine Beschreibung oben etwas schlampig... Also ich lasse eine Punktwolke in ein Gitter zu überführen, was auch klappt. Die Daten will ich dann durch ein Kriterium auslesen und gleichzeitig in eine neue Matrix überführen bzw. neue Werte erstellen ... Aber Dein Ansatz scheint zu klappen und ist in eine paar Sekunden durch wobei mein Ansatz eine Stunde dauert ... Das Ganze wird für mehrere Datenfiles wiederholt und dummerweise überschreibt mein skript bei jedem loop die neue matrix aber DANK DIR bin ich auf einem gutem Weg seit WOCHEN ... DANKE
Code:
% einlesen der Daten in einem loop % gitter aufspannen im punktdaten in ein mesh zu setzen
nx=100% resolution in X
ny=200% resolution in Z
nz=20% resolution in Y !!!
%factor_grid=1.5
x_lin = linspace(min(xcut_2),max(xcut_2),nx);
y_lin = linspace(min(zcut_2),max(zcut_2),ny);
z_lin = linspace(min(ycut_2),max(ycut_2),nz);
% griddata zum interpolieren einer punkwolke x= xcut_2,y= ycut_2, z = zcut_2 und wert disp_z,
mesh_disp = griddata(xcut_2,ycut_2,zcut_2,disp_z,xq,yq,zq,'linear');
% contour slice !!! [a,b,c]=size(xq);
%plot alte matrix
figure(1) slice(xq,yq,zq,mesh_disp,[],0.01,[]);
shading flat
% =============funktioniert bis dahin =========== % allocation der neuen matrix if counterr<=1
timeee=1
timeee(1:a,1:b,1:c)=0;
end
% alter ansatz mit ind2sub von alter matrix % [r,v,p] = ind2sub(size(mesh_disp),find(mesh_disp<0.002)); % das dauert eine stunde plus
timeee(r,c,v)=0.1;
% Ansatz von Harald !!!
timeee(mesh_disp<0.002) = 0.1;
wenn du das Überschreiben verhindern willst, kannst du z.B. ein Cell Array von Arrays anlegen und dann immer mit timeee{k} statt mit timeee arbeiten. Natürlich kostet es auch entsprechend mehr Speicher. Wenn die Arrays also sehr groß sind, kann es hinsichtlich Speicher sogar besser sein, sie zu überschreiben.
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 ;)
vielen vielen DANK !!!! Das läuft jetzt viel schneller ... Habe gestern den ganzen Tag rumgetüftelt ... aber hast Du eine Idee wie ich die Anzahl von 3D punkten in einem Mesh zählen lassen kann ... Mein Ansatz wäre ein Mesh aufzuziehen alle Zellen durchzuloopen und dann mit einer Abfrage prüfen ob sich, die Punkte in der Zelle befinden um die Konzentration zu berechnen. Ich befürchte nur dass diese Abfrage wieder sehr lange dauert... Oder denke ich da zu kompliziert ...
Dennoch nochmals vielen DANK!!!
was verstehst du unter einem Mesh? Möchtest du, dass die 3 Werte jeweils in einem bestimmten Intervall sind? Dazu würde ich logische Indizierung verwenden.
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 ;)
vielen Dank für Deine Antwort !!!!!!!!!!! Mit der 3D Matrix meinte ich den code unten. Das scheint zu tun was es soll nur, dass es wieder sehr lange dauert bis er alle Zellen durchgeloopt hat ... Was meinst Du ? DANKE!!!
Code:
% einlesen der punkt daten x y z koordinaten bei mir sind das xcut_2 ycut_2 zcut_2 % Mesh aufspannen 3D matrix dimensionen der Punktwolke
nx=200% resolution in X
ny=400% resolution in Z
nz=200% resolution in Y !!!
habe jetzt noch etwas herumprobiert ... es funktioniert eigentlich alles wie ich mir das vorstelle. Nur dauert der Loop sehr lange ... Hat jemand eine idee wie man einen solchen loop beschleunigen kann ? Vielen vielen DANK
Code:
for f=1:a-1
percentage_loop = f/a*100 for i=1:b-1 for j=1:c-1
suchzelle=find(xcut_2>xq(f,i,j)-(xn)&xcut_2<xq(f+1,i+1,j+1)...
+(xn)&ycut_2>yq(f,i,j)-(yn)&ycut_2<yq(f+1,i+1,j+1)&zcut_2>zq(f,i,j)-(zn)&zcut_2<zq(f+1,i+1,j+1));
%scatter3(xcut_2(suchzelle),ycut_2(suchzelle),zcut_2(suchzelle),'.')
test=xcut_2(suchzelle);
if test>0
für mich sieht das wie gesagt nach einem 3D-Histogramm aus. Hast du denn mal den Link von 28.10.2021, 10:00 versucht?
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 ;)
Nein hatte ich nicht versucht da ich etwas Falsches darunter verstanden habe ;(((( aber es funktioniert und rechnet viel schneller !!!! DAAAANNNNKKKKEEEE !!! jetzt nur noch interpolieren dann sollte es auch gut aussehen ... MERCI !!!
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.