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

Komma separierte Liste, multidimensionale Matrix verkleinern

 

Nesta

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2013, 10:56     Titel: Komma separierte Liste, multidimensionale Matrix verkleinern
  Antworten mit Zitat      
Hallo Community,

ich habe eine multidimensionale Matrix Z, deren Dimension n erst während der Laufzeit bekannt wird und je nach Datensatz unterschiedlich sein kann. Die Anzahl der Elemente in jeder Dimension sei hier einfach x1, ... , xn.

Nun soll die Matrix in jeder Dimension immer um das letzte Element verkleinert werden, also so etwas wie Z = Z(1:x1-1, ... 1:xn-1). So könnte ich den Code aber nur schreiben wenn ich von Anfang an die Anzahl der Dimensionen kenne, was ja leider nicht der Fall ist.

Ähnliche Probleme konnte ich an anderer Stelle mit der "Komma separierten Liste" lösen. Z.B. gebe ich der Funktion histcn, die als einzelne Argumente, die Anzahl der Elemente in jeder Dimension braucht eine Komma separierte Liste mit hilfe eines Cell-Arrays:

Code:

X = [x1 ... xn];
X = mat2cell(X, 1, ones(1, n));
[Z, edge, mid, loc] = histcn(data, X{:}, 'AccumData', dP);
 


Das funktioniert bei meinem Problem aber leider auch nicht, da hier die Komma separierte Argumente immer die Form: 1:x1-1 haben. Andere Möglichkeiten, wie zB.
Code:

Z(x1,..., :) = [];
.
.
.
Z(:, ..., xn) = [];
 

klappen auch nur wenn die Anzahl der Dimensionen bekannt und immer gleich ist.


Für einen guten Tipp, ob und wie man das lösen könnte wäre ich wirklich sehr dankbar

Grüße

Nesta


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 30.07.2013, 10:58     Titel:
  Antworten mit Zitat      
sowas in der art ?
Code:
x=1:4
x=x(1:end-1)

sonst währe ein lauffähigs beispiel das deine fehler verursacht sinnvoll. damit man das besser nachvollzihene kann was du versucht hast und was nicht klappt.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Nesta

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2013, 11:16     Titel:
  Antworten mit Zitat      
Das ist leider nicht das was ich suche. Diese Lösung würde auch nur dann funktionieren, wenn ich die Anzahl der Dimensionen im vorhinein kenne und diese auch immer gleich ist.

Ich suche einen Code der mir für eine beliebige Anzahl an Dimensionen immer die Letzten Elemente in der Matrix Z streicht.

Grüße

Nesta
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 30.07.2013, 12:24     Titel:
  Antworten mit Zitat      
hmm vieleicht könnte man etwas mit eval ndims und ner forschleife basteln
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.07.2013, 12:48     Titel: Re: Komma separierte Liste, multidimensionale Matrix verklei
  Antworten mit Zitat      
Hallo Nesta,

Eine Idee, die zunächst etwas unhandlich aussieht, aber zumindest funktioniert:
Code:
A = rand(3,4,5,6,3);
dim = size(A);
n = length(dim);
Index = cell(1, n);
for iDim = 1:n
  Index(:) = {':'};
  Index{iDim} = dim(iDim);
  A(Index{:}) = [];
end

Oder:
Code:
A = rand(3,4,5,6,3);
dim = size(A);
n = length(dim);
Index = cell(1, n);
for iDim = 1:n
  Index{iDim} = 1:dim(iDim) - 1;
end
A = A(Index{:});

Das explizite Erstellen der Vektoren in "Index" könnte hier aber teuer werden. Dafür wird in der oberen Methode ein Array wiederholt verkleinert, was auch nicht effizient ist.
Vielleicht is Logical Indexing schneller:
Code:
A = rand(3,4,5,6,3);
dim = size(A);
n = length(dim);
Keep = true(size(A));
Index = cell(1, n);
for iDim = 1:n
  Index(:) = {':'};
  Index{iDim} = dim(iDim);
  Keep(Index{:}) = false;
end
A = A(Keep);

Nun hast Du drei Ideen zum spielen. Viel Erfolg!

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 30.07.2013, 12:57     Titel:
  Antworten mit Zitat      
Code:
x=rand(3,4,5,6,3);
eval(['x2=x(',repmat('1:end-1,',1,ndims(x)-1),'1:end-1)']);

das wäre meine obrige variante mit eval...
ich würde dir aber jans varianten empfehlen weil eval dumm zu debuggen ist. habs hier nur der vollständigkeit halber gepostet Smile
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Nesta

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2013, 18:07     Titel:
  Antworten mit Zitat      
Vielen Dank für die ausführliche Hilfe !
 
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 - 2025 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.