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

Vektoren erweitern

 

Sophie_21

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.01.2012, 12:48     Titel: Vektoren erweitern
  Antworten mit Zitat      
Hallo,

habe folgendes Problem: Gegeben zwei Vektoren (derzeit Spaltenvektoren) gleicher Größe in folgender Form:

V1 = [1;2;3;4;5;6;7;8]

V2 = [0;0;0;2;0;4;0;1]

Die Summe der Elemente von V2 ist 7.

Aus diesen beiden Vektoren soll ein dritter Vektor (V3) erzeugt werden, welcher genau 7 Elemente mehr enthalten soll, wie Vektor V1. Solange V2(i)=0, ist V3(i)=V1(i). Wenn V2(i) ungleich 0 ist (z.B. 2), soll V3 für die nächsten 2 Elemente den Wert von V1(i-1) annehmen. Im Prinzip stellt V3 eine Erweiterung von V1 dar. V3 sollte nach diesem Vorgehen wie folgt aussehen:

V3 = [1;2;3;3;3;4;5;5;5;5;5;6;7;7;8]

Wie könnte man dies programmieren?

Gruß

Sophie


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 30.01.2012, 14:28     Titel:
  Antworten mit Zitat      
Also

irgendwie so

Code:

V1           = [1;2;3;4;5;6;7;8];
V2           = [0;0;0;2;0;4;0;1];
V3           = zeros(length(V2)+sum(V2),1);
% erstmals Positionen suchen die vervierfacht werden
mult_pos     =  find(V2>0)-1;
% Indizes zum Einfügen in V3 berechnen
e            =  mult_pos + cumsum(V2(V2>0));
s            =  e-V2(V2>0)+1;
% einfügen der Multiple-Positionen in V3
V3(s)        = mult_pos;
V3(e+1)      = -mult_pos;
%
V3           = cumsum(V3);
% Ursprungspositionen für V1 merken
pos_zero     = V3==0;

% Multiple-Werte reinschreiben an der zuvor berechnete Positionen
V3(~pos_zero)= V1(V3(~pos_zero));
% Ursprungswerte von V1 übernehmen
V3(pos_zero) = V1;
 
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.01.2012, 14:36     Titel:
  Antworten mit Zitat      
Code:
for k=1:length(V2)
    if V2(k)~=0
        V2(k-1)=V2(k)+1;
        V2(k)=0;
    end  
end
V3=[];
for k=1:length(V2)
    if V2(k)==0
        V3=[V3;V1(k)];
    end
    if V2(k)~=0
        for i=1:V2(k)
            V3=[V3;V1(k)];
        end
    end
end

habs mal mit ner verschachtelten forschleife gelöst.
Private Nachricht senden Benutzer-Profile anzeigen
 
Sophie_21

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.01.2012, 14:44     Titel:
  Antworten mit Zitat      
Vielen Dank Euch beiden, genau das hatte ich gesucht!!!!
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 30.01.2012, 18:53     Titel:
  Antworten mit Zitat      
Noch eine Möglichkeit:

Code:

V1           = [1;2;3;4;5;6;7;8];
V2           = [0;0;0;2;0;4;0;1];
v3_size    = length(V2)+sum(V2);
V3           = nan(v3_size,1);

idx = (1:length(V1))' +cumsum(V2);
V3(idx) = V1
 
while(any(isnan(V3)))
  T3 = [0;V3];
  V3(isnan(V3)) = T3(isnan(V3))
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Sophie_21

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2012, 20:25     Titel:
  Antworten mit Zitat      
Wie müsste der Code verändert werden, wenn gegeben:

V1 = [0;0;0;2;0;4;0;1]

V1 soll nun zusätzlich so umgewandelt werden, dass wenn V1(i)=0 auch V2(i)=0. Wenn V1(i) ungleich 0 (z.B. 2) sollen V2(i)=1 und V2(i+1)=1, usw. V2 sollte dann so aussehen:

V2= [0;0;0;1;1;0;1;1;1;1;0;1]

Vielen Dank im Voraus!

Sophie
 
Sophie_21

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 10:12     Titel:
  Antworten mit Zitat      
Hat keiner einen Vorschlag?
 
Sophie_21

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 10:39     Titel:
  Antworten mit Zitat      
Danke, hat sich erledigt. Bin durch eine Weile Probieren selbst darauf gekommen.

Code:

for k=1:length(V2)
    if V2(k)==0
       V3=[V3;0];
    end
   if V2(k)~=0
       for i=1:V2(k)
           V3=[V3;1];
       end
    end
end
 


Sophie
 
Sophie_21

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 11:07     Titel:
  Antworten mit Zitat      
Gibt es eine Möglichkeit diesen Code zu optimieren? Er funktioniert zwar, aber bei sehr großen Vektoren beschert er einem recht lange Wartezeiten.

Vielen Dank im Voraus!

Sophie
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 02.02.2012, 11:21     Titel:
  Antworten mit Zitat      
hast du v3 vorher schon angelgt in der größe wie er sein wird? wenn nicht frisst das sehr viel zeit. guck dir dazu mal das beispiel von denny an.
Private Nachricht senden Benutzer-Profile anzeigen
 
Sophie_21

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 11:34     Titel:
  Antworten mit Zitat      
Ja, habe V3 zuvor schon mit

Code:

V3 = zeros(length(V2)+sum(V2),1);
 


angelegt. Leider bringt dies auch nichts.
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 02.02.2012, 11:41     Titel:
  Antworten mit Zitat      
nein mit der schleife die du benutzt bringt das nix ^^ da du an v3 hinten was ranhängst. du hast meinen vorschlag von oben genommen. der ist leicht zu druchblichen. hat aber den nachteil das er langsam ist. du solltest versuchen den vorschlag von denny zu benutzen. dort wird der vektor vorher in seiner vollen größe angelegt und dann werden die elemente aufgefüllt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Sophie_21

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2012, 13:08     Titel:
  Antworten mit Zitat      
Komme leider überhaupt nicht mit den Code von denny klar und wiese absolut nicht wo ich da ansetzen kann.
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 03.02.2012, 15:27     Titel:
  Antworten mit Zitat      
Hallo Sophie,

verstehe nicht ganz, was für Unterschied zwischen dem oberen Beispiel und dem unteren Beispiel
Meinst du so was?

Code:

V2         = [0;0;0;2;0;4;0;1];
V1         = V2>0;

numb     = sum(V2(V2>0)-1);

v3_size  = length(V2)+numb;
V3          = nan(v3_size,1);

idx       =  V2;
idx(V2>0) =  V2(V2>0)-1;
idx = cumsum(idx);
idx = (1:length(V1))' +[0;idx(1:end-1)];
V3(idx) = V1;
 
while(any(isnan(V3)))
  T3 = [0;V3];
  V3(isnan(V3)) = T3(isnan(V3));
end
 
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Sophie_21

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2012, 15:05     Titel:
  Antworten mit Zitat      
Hallo zusammen,

könnte mir jemand bitte den Code von denny kommentieren. Komme nicht so recht klar damit.

Gruß
Sophie
 
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.