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

Array aus Zeilenvektoren

 

TobinProject
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 02.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2011, 17:11     Titel: Array aus Zeilenvektoren
  Antworten mit Zitat      
Hi!

Ich versuche verzweifelt ein Array aus Vektoren zu erzeugen.
Konkret habe ich einen Spaltenvektor (
Code:
BB_Parameters(:,12)
), der ganze Zahlen enthält.
Aus diesem Vektor möchte ich ein Array erzeugen, das jeweils in der ersten Spalten den Wert (ganzzahlig ist der schon) aus dem obigen Spaltenvektor hat und dann eine Reihe erzeugt bis runter zu 1; also
Code:
[BB_Parameters(:,12):-1:1]


Probiert habe ich schon sämtliche kombinationen aus eckigen, runden, geschwungenen Klammern. Ich komme einfach nicht darauf wie es geht.

Beispiel:
Spaltenvektor = [0;2;5]
Wunschergebnis (3x5) =
0 0 0 0 0
2 1 0 0 0
5 4 3 2 1

Mein letzter Versuch:
Code:
[DecompVector_Buy(:,2:BB_Parameters(:,12))] = [0;BB_Parameters(:,12)-1:-1:1]


Vielen Dank für Eure Hilfe
_________________

Bouchaud
www.tobin-project.com
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

ich bin wie immer für Versuche ohne for-Schleife offen, glaube aber, dass es nicht viel einfacher geht:

Code:
Spalte = [0;2;5];
M = zeros(length(Spalte), max(Spalte));
for I=1:length(Spalte)
    M(I,1:Spalte(I)) = Spalte(I):-1:1;
end


Grüße,
Harald

P.S.: bitte nach Möglichkeit immer den bisher vielversprechendsten Ansatz posten.
Private Nachricht senden Benutzer-Profile anzeigen
 
TobinProject
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 02.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2011, 19:12     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für die schnelle Antwort.
Ich arbeite in der Prototyp-Phase mit rung 900 Tausend Datensätzen. Ich habe an einer anderen Stelle erfolgreich eine For-Schleife ersetzen können. Diese ist damals 2h lang gelaufen. Nach Ersatz durch entsprechende Matrix-Manipulationen, konnte ich es unter 3,5 sek bringen.

Ich habe es jetzt mal mit einer for-Schleife probiert, wie Du vorgeschlagen hast, damit ich wenigstens mal das Ergebnis speichern kann. Der Code läuft aber jetzt auch schon 1,5h und ist noch nicht fertig.

Eine parfor bringt zwar noch eine erhebliche Effizienzsteigerung, jedoch bin ich noch immer in der Hoffnung, dies über Matrix-Manipulationen erreichen zu können.

mfG
Bouchaud
_________________

Bouchaud
www.tobin-project.com
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bei so großen Datenmengen ist die Frage auch:
- Was willst du mit dem Ergebnis machen, hinsichtlich Weiterverarbeitung? Kann man das Ergebnis evtl. direkt erzeugen?
- Zudem: Wie groß sind die Einträge einer Spalte maximal?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
TobinProject
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 02.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2011, 21:17     Titel:
  Antworten mit Zitat      
(Anrede lass ich mal weg, da wir uns ja jetzt schon so gut kennen Smile )


Ich erzeuge über eine Zeitreihe (900kx1) Signale (0 und 1). Jedes dieser Signale erzeugt dann in weiterer Folge eine weitere Zeitreihe (990 x n).

Um zu bestimmen ab wann eine solche Zeitreihe aktiv ist - also ungleich null - muss zuerst der logische Vektor von oben (900k x 1; 0 und 1) umgewandelt werden in eine logische Matrix (900k x n).
Das wollte ich über den Zwischenschritt einer kumulierten Signalreihe "BB_Parameters(:,12)" erreichen.
Dieser Schritt muss 2 Mal ausgeführt werden - weil es noch ein weiteres Signal gibt, das das Ende der Gültigkeit der Einzelzeitreihen definiert.

Im Endeffekt folgen dann noch ein paar einfache Matrixmultiplikationen und statistische Auswertungen über die Einzelzeitreihen.

Deiner Frage nach der Größe entnehme ich, dass es evtl Sinn machen würde die Matrix als Integer zu deklarieren oder habe ich das falsch verstanden?
Die Zeitreihe selbst kann sehr sehr lang werden - derzeit schätze ich, dass eine für mich sinnvolle Zeitreihe ca. 240 Mio Datenpunkte hat.

mfG
Bouchaud
_________________

Bouchaud
www.tobin-project.com
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.11.2011, 21:38     Titel:
  Antworten mit Zitat      
Hallo,

ich kenne deine Anwendung nicht, kann das hier nicht wirklich nachvollziehen und kann daher nicht beurteilen, ob die Vorgehensweise so sinnvoll ist.
Nein, es ging mir nicht um Integerdatentypen, auch wenn das bei knapp werdendem Speicher natürlich auch eine Option ist. Der Gedanke war, die möglichen Zeilen zu erzeugen und dann zuzuweisen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
TobinProject
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 02.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.11.2011, 11:48     Titel:
  Antworten mit Zitat      
Hallo Harald,

Vielen Dank für den Hinweis mit den "möglichen Kombinationen". Es stimmt auch wenn ich 240 Mio Zeilen auswerte, gibt es eine weit geringere Anzahl an möglichen Reihen.

Ich habe daher zuerst die möglichen Kombinationen.
DecompIndex_Buy=
0 0 0 0 0
1 0 0 0 0
2 1 0 0 0
3 2 1 0 0
4 3 2 1 0
5 4 3 2 1
Hierzu erzeuge ich die Zahlenfolge mit der größten Basis (5 4 3 2 1) und erzeuge aus diesem Vektor eine Matrix mit versetzten Vektoren.

Da über die erste Spalte die Zuordnung erfolgt und es keinen Index 0 gibt muss ich einen Hilfsindex erzeugen, der einfach "+ 1" ist (Positions_HelpIndex).
Dann erfolgt die Zuweisung.

Code:

% Create Buy-Decomp-Index
DecompIndex_Buy_HelpVector = [1:1:No_Long_Positions];
DecompIndex_Buy_Lags = [0 [1:1:(No_Long_Positions-1)]];
DecompIndex_Buy_Rows=size(DecompIndex_Buy_HelpVector,2)+1;
DecompIndex_Buy_Cols=size(DecompIndex_Buy_Lags,2);
DecompIndex_Buy(2:DecompIndex_Buy_Rows,1:DecompIndex_Buy_Cols) = [lagmatrix(DecompIndex_Buy_HelpVector,DecompIndex_Buy_Lags)];

% Replace NaN by 0
NaN_Inf_locations = find(isnan(DecompIndex_Buy));
DecompIndex_Buy(NaN_Inf_locations) = 0;

% Zeilen aus DecompIndex in kumulierte Signale einsetzen
Positions_HelpIndex =[BB_Parameters(:,12)+1];
Positions=[DecompIndex_Buy([Positions_HelpIndex(:,1)],:)];
 


Die For-Schleife habe ich gestern nach etwa 3h abgebrochen. 400k von 900k Datensätzen waren bis dahin verarbeitet - hätte also in Summe wahrscheinlich 5h gedauert. Mit dem Code oben schaffe ich es im Schnitt unter 6 sek.

Das ist zumindest mal eine halbwegs akzeptable Zeit. Ich gehe davon aus, dass eine effizienterer Lösungsvorschlag nur durch Erklärung des Gesamtkontexts möglich wäre (-> Status: beantwortet). Deshalb Danke erstmal für Deine Hilfe!

mfG
Bouchaud
_________________

Bouchaud
www.tobin-project.com
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: 03.11.2011, 13:55     Titel:
  Antworten mit Zitat      
Hallo TobinProject,

6 Sekunden statt 5 Stunden? Irgendwie klingt das immer nach einer fehlenden oder falschen Pre-allocation. Dann wächst die Laufzeit allerdings exponentiell, also kann man nach einem Abbruch nach der Hälfte der Daten nicht mit einer doplletlen Laufzeit mit den Gesamt-Daten rechnen.

Das exponentielle Laufzeitverhalten ist sogar ein guter Indikator für Pre-Allocation-Probleme. Wenn man mit 1000, 2000, 4000 Datensätzen testet und sich die Laufzeit endgegen den Erwartungen nicht linear verhält, liegt höchstwharscheinlich ein solches Problem vor.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
TobinProject
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 02.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.11.2011, 15:34     Titel:
  Antworten mit Zitat      
Hallo Jan!

Ja, da gebe ich Dir recht. Ich habe damals sicher nicht das Feld initialisiert.
Ich glaube aber, dass ich bei der Anzahl an Datensätzen Schleifen vermeiden sollte solange es geht, oder?
Bin mit meiner Vorgehensweise semi-zufrieden, da ich egtl hoffte ich könnte die notwendige Matrix in einem Schritt erzeugen.
Für die Decomposition eines Vektors in eine Matrix sind aber ein paar Nebenbedingungen notwendig, die man evtl über einen Operator berücksichtigen kann. Das übersteigt aber leider mein Wissen beim Matrizenrechnen.

mfG
Bouchaud
_________________

Bouchaud
www.tobin-project.com
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 - 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.