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 Matrixzuweisung

 

challenger
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 30.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2014, 12:00     Titel: 3D Matrixzuweisung
  Antworten mit Zitat      
Hallo zusammen

Ich habe zwei 3D Arrays mit gleicher Dimension. Das eine Array enthält Messwerte (M), die andere enthält fortlaufende Integerwerte (ID).

Jetzt geht es darum, alle Werte der Matrix M, welche mit einem spezifischen Integerwert der ID Matrix korrespondieren, in eine separate Matrix zu speichern (wiederum mit den gleichen Dimensionen wie die Ursprungsmatrix).

Da ich dies relativ oft tun muss, würde ich gerne fragen, was dafür eurer Meinung nach wohl die effizienteste Lösung ist. Man könnte es mit logical Arrays machen, habe aber damit Performancemässig schlechte Erfahrungen gemacht.

Um Hilfe wäre ich sehr dankbar!

Viele Grüsse
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 07.07.2014, 12:09     Titel: Re: 3D Matrixzuweisung
  Antworten mit Zitat      
Hallo,

mir ist nicht ganz klar, was das bedeutet:
challenger hat Folgendes geschrieben:
Ich habe zwei 3D Arrays mit gleicher Dimension. Das eine Array enthält Messwerte (M), die andere enthält fortlaufende Integerwerte (ID).

Vielleicht soetwas hier? Bitte sonst ein Beispiel geben.
Code:
M = rand(3,4,5);
ID = reshape(1:3*4*5,3,4,5);


Auch das verstehe ich nicht:
challenger hat Folgendes geschrieben:

Jetzt geht es darum, alle Werte der Matrix M, welche mit einem spezifischen Integerwert der ID Matrix korrespondieren, in eine separate Matrix zu speichern (wiederum mit den gleichen Dimensionen wie die Ursprungsmatrix).

Wenn die ID fortlaufende Integerwerte enthält, kommt doch jeder Integerwert nur ein mal vor, richtig? Selbst wenn der öfter vorkommt, wie willst du eine Matrix derselben Dimension mit einer Teilmenger der Matrix M füllen? Das sind ja zu wenig Werte. Außerdem ist nicht klar, an welche Stelle die Werte dann in die Matrix geschrieben werden sollen... kannst du dafür ein Beispiel geben?

Ansonsten hilft dir vielleicht auch Funktion sub2ind(), mit der kannst du die 3D Indizes in einen linearen Index umwandeln, mit dem du eventuell leichter hantieren kannst.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
challenger
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 30.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2014, 12:24     Titel:
  Antworten mit Zitat      
Hab mich da wohl nicht klar ausgedrückt.

Ich geb mal etwas Hintergrund:

Es handelt sich um Fluiddynamische Messungen von Zweiphasenströmungen (hier: Luftblasen in Wasser). Was wir messen ist der Gasgehalt in einem dreidimensionalen Messfeld (d.h. wir haben Messwerte für den Gasgehalt in x,y und z Richtung). Wenn in einem bestimmten Punkt Wasser ist, ist der Gasgehalt logischerweise null, wenn Luft ist, 1. Da das Messfeld diskret ist gibt es auch noch Zwischenwerte zwischen 0 und 1 (für die Grenzfläche zwischen Blase und Wasser).

Das zweite Array enthält nun die Blasennummer (die ID der Blase). Wenn wir bspw. zwei Blasen haben, gibt es im Messarray zwei Zonen die die Gasgehalte haben und das ID Array zeigt in allen Elementen, wo sich die Entsprechende Blase befindet, deren ID numer (also 1 und 2 hier).

Im Prinzip möchte ich jetzt jede Blase einzeln extrahieren können. Das heisst, ich möchte die nur die erste Blase in einem separaten Array (dort, wo die ID Matrix den Wert 1 hat).

Es ist notwendig, diese in einem 3D Array zu behalten, da diese Werte in einem späteren Verlauf noch Kreuzkorreliert werden sollen.

In anderen Worten: ich suche nach all jenen Eementen in der Matrix M für die in der ID Matrix der Wert 1 (2,...i) gilt.

Danke vielmals für die Mühe und die Antwort. Ich hoffe, es ist jetzt verständlicher, ansonsten könnte ich noch zwei kleine Dummy Matrizen zur Verfügung stellen.

Viele Grüsse
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 07.07.2014, 12:42     Titel:
  Antworten mit Zitat      
Hallo,

den Hintergrund zu erfahren ist zwar eigentlich immer ganz interessant, verwirrt aber meist nur - Dummymatrizen mit dem was gegeben ist und dem, was hinterher herauskommen soll sind eigentlich immer gut. Das kann man direkt copy & pasten und kann sofort loslegen, ohne sich selbst Daten erstellen zu müssen die womöglich dann noch falsch formatiert sind oder ähnliches.
Wenn ich es nun richtig verstehe, dann wüsste ich nichts schnelleres, als logical indexing mit preallozierten Matrizen. Um die Schleife um die Blasen-ID kommt man wohl nicht drum rum.
Vorschlag:
Code:
M = (rand(3,4,5)-0.4)*2;
M = max(min(M,1),0);    % Werte zwischen 0 und 1 mit vielen 0en und 1en
nBlasen = 3;
ID = randi(nBlasen+1,size(M))-1;  % zufallsmatrix mit 0en, 1en und 2en und 3en

Blasen = cell(1,nBlasen);
for id = 1:nBlasen
    temp = zeros(size(M));
    temp(ID==id) = M(ID==id);
    Blasen{id} = temp;
end

Da passt das mit den Werten 0-1 und den Blasenindizes natürlich nicht zusammen, aber prinzipiell sollte das so funktionieren. Falls nicht, bitte noch mal melden.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
challenger
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 30.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2014, 12:50     Titel:
  Antworten mit Zitat      
Hey Nras

Danke, das funktioniert so hervorragend und auch einigermassen fix.

Danke auch für die Tips Wink.

Alles Gute!
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.