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

3D Matrix klassifizieren

 

hansolo_der_III
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 19.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2021, 14:31     Titel: 3D Matrix klassifizieren
  Antworten mit Zitat      
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

Code:
[r,c,v] = ind2sub(size(alteMatrix),find(alteMatrix<0.002));
neueMatrix(r,c,v)=0.1;
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.10.2021, 20:32     Titel:
  Antworten mit Zitat      
Hallo,

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:
Code:
neueMatrix(alteMatrix<0.002) = 0.1;


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
 
hansolo_der_III
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 19.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2021, 22:11     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen vielen Dank für Deine schnelle Antwort!!!
Ich hatte ich wirklich mit Hilfe gerechnet Wink 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);

xn=x_lin(2)-x_lin(1);
yn=y_lin(2)-y_lin(1);
zn=z_lin(2)-z_lin(1);

[xq,yq,zq] = meshgrid(x_lin, y_lin, z_lin);

% 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

size(timeee)
size(mesh_disp)

% 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;

figure(2)
  slice(xq,yq,zq,timeee,[],0.01,[]);
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
hansolo_der_III
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 19.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2021, 09:10     Titel:
  Antworten mit Zitat      
Hallo Harald,

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!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.10.2021, 10:00     Titel:
  Antworten mit Zitat      
Hallo,

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.

Falls du quasi ein 3D Histogramm machen möchtest:
https://de.mathworks.com/matlabcent.....mensional-histogram-count

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
 
hansolo_der_III
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 19.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2021, 10:15     Titel:
  Antworten mit Zitat      
Hallo Harald,

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 !!!

% x_lin = linspace(min(xcut_2),max(xcut_2),nx); %0 - 0.02
% y_lin = linspace(min(zcut_2),max(zcut_2),ny); %0 - 0.04
% z_lin = linspace(min(ycut_2),max(ycut_2),nz); %0 - 0.02

x_lin = linspace(0.0095,0.0105,nx); %0 - 0.02
y_lin = linspace(0.0095,0.0105,ny); %0  -0.04
z_lin = linspace(0.005,0.015,nz); %0 - 0.02

xn=x_lin(2)-x_lin(1);
yn=y_lin(2)-y_lin(1);
zn=z_lin(2)-z_lin(1);

[xq,yq,zq] = meshgrid(x_lin, y_lin, z_lin);
[a,b,c]=size(xq);
besetze_zellen(a,b,c)=0;
% loop durch das ganze gitter
for f=1:a-1 %50
    percentage_loop = f/a*100
    for i=1:b-1 %50
        for j=c-1 %50
            suchzelle=find(xcut_2>xq(f,i,j)-(xn)&xcut_2<xq(f+1,i+1,j+1)+(xn)&zcut_2>yq(f,i,j)-(yn)&zcut_2<yq(f+1,i+1,j+1)+(yn)&ycut_2>zq(f,i,j)-(zn)&ycut_2<zq(f+1,i+1,j+1)+(zn));
            disp(suchzelle)
            scatter3(xcut_2(suchzelle),ycut_2(suchzelle),zcut_2(suchzelle),'.')

[rr cc]=size(xcut_2(suchzelle)); % zaehlen der anzahl der partikel in der zelle
besetze_zellen(f,i,j)=rr ; % gitter wird mit werten beastückt

       
        end
    end
end    
%plot mit slice
 
Private Nachricht senden Benutzer-Profile anzeigen
 
hansolo_der_III
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 19.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.11.2021, 09:46     Titel:
  Antworten mit Zitat      
Hallo,

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
               
                      [ss ll]=size(test)
                         betrag_number(f,i,j)=ss;
             end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.11.2021, 11:22     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
hansolo_der_III
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 19.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.11.2021, 12:54     Titel:
  Antworten mit Zitat      
Hallo Harald,

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 !!!

Code:
clear all
x=rand(50,1);
y=rand(50,1);
z=rand(50,1);
xedges=0:0.1:1;
yedges=0:0.1:1;
zedges=0:0.1:2;
n=histcnd(x,y,z,xedges,yedges,zedges);
[xq,yq,zq] = meshgrid(xedges, yedges,zedges);
slice(xq,yq,zq,n,[],0.3,[]);
 
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.