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

Vektor: Zahlen ersetzen abhängig von vorgängiger Zahl

 

liso
Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 12.07.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2014, 18:21     Titel: Vektor: Zahlen ersetzen abhängig von vorgängiger Zahl
  Antworten mit Zitat      
Hallo Alle

Ich habe folgende Frage:

Ich habe einen Vektor (see input example). Der Vektor besteht aus den Zahlen 0, 1, 2, 3, 4.
Nach jeder Zahl 1, 2, 3, 4 möchte ich die Zahl 0 in jeweils vier Zellen mit der gleichen vorgängigen Zahl ersetzen.
Wie würdet Ihr das schreiben?

Vielen Dank im Voraus.
Lisa

output_example.txt
 Beschreibung:

Download
 Dateiname:  output_example.txt
 Dateigröße:  348 Bytes
 Heruntergeladen:  269 mal
input_example.txt
 Beschreibung:

Download
 Dateiname:  input_example.txt
 Dateigröße:  348 Bytes
 Heruntergeladen:  280 mal
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: 12.07.2014, 17:34     Titel: Re: Vektor: Zahlen ersetzen abhängig von vorgängiger Zahl
  Antworten mit Zitat      
Hallo Lisa,

Zitat:
Ich habe einen Vektor (see input example).

Das Text-file ist keine gute Wahl das Problem zu erklären. Du schreibst von "Zellen". Heißt das, dass die Zahlen in einem Cell-Array stehen? Oder sind das Vektoren von Typ DOUBLE?

Zitat:
Nach jeder Zahl 1, 2, 3, 4 möchte ich die Zahl 0 in jeweils vier Zellen mit der gleichen vorgängigen Zahl ersetzen.

Das verstehe ich nicht. Bitte gib ein kurzes Beispiel, das eindeutig den gewünschten Vorgang definiert.

Wie wäre es mit einer einfachen FOR-Schleife, die über alle Elemente geht?
Zeige doch mal, was Du bisher versucht hast.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 12.07.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2014, 00:22     Titel:
  Antworten mit Zitat      
Hallo Jan

Danke für Deine Nachricht.
Entschuldige meine Ausdrucksweise, ich bin die Matlab Sprache noch nicht gewöhnt.
Es handelt sich um einen Vektor vom Typ Double. Ersetzt werden soll eine beliebige Anzahl von Nullen (z.B. 3, 4, 5 oder....) mit der jeweils vorangehenden Zahl.

Hier nochmals ein Bespiel:
%input
x = [0;0;0;1;0;0;0;0;0;0;2;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;3;0;0;0;0;0;0;0;4;0;0;0;0;0;0;0;0;2;0;0;0;0;0;0;0;]
%output
y = [0;0;0;1;1;1;1;0;0;0;2;2;2;2;0;0;0;1;1;1;1;0;0;0;0;0;3;3;3;3;0;0;0;0;4;4;4;4;0;0;0;0;0;2;2;2;2;0;0;0;0;]

Ich hoffe, dies its besser verständlich.
Danke nochmals für einen Vorschlag.

Gruss
Lisa
Private Nachricht senden Benutzer-Profile anzeigen
 
liso
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 12.07.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2014, 09:48     Titel:
  Antworten mit Zitat      
Hallo Jan
Folge Lösung habe ich in einem anderen Beitrag gefunden, was meinem Problem schon etwas nahe kommt. Hier werden ALLE Nullen ersetzt mit der vorangehenden Zahl.
- Was hier noch fehlt ist die Angabe der ANZAHL der Nullen die ersetzt werden sollen.
- Ferner funktioniert es nicht, wenn am Anfang eine Null steht.
Gibt es hierzu eine Lösung?

Danke und Gruss
Lisa


X = [1,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,]

%%
if X(1)==0
error('invalid data');
end
Ind=find(X==0);
for k=Ind
X(k)=X(k-1);
end
%%
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.07.2014, 09:54     Titel:
  Antworten mit Zitat      
Hallo,

eine Möglichkeit:
Code:
nichtnull = find(x~=0);
y = zeros(size(x));
for I=1:numel(nichtnull)
    idx = nichtnull(I);
    y(idx:idx+3) = x(idx);
end
 

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 12.07.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2014, 10:08     Titel:
  Antworten mit Zitat      
Danke, merci vielmals!
Lisa
Private Nachricht senden Benutzer-Profile anzeigen
 
liso
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 12.07.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2014, 13:17     Titel:
  Antworten mit Zitat      
Hallo Harald

Danke nochmals, Deine Lösung läuft gut.
Es gibt Fälle in welchen zwei gleiche Zahlen eng benachbart sind:
Hier ein Beispiel:
X = [0,0,0,1,0,0,0,0,0,0,2,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,0,4,0,0,0,0,0,0,2,0,0,0,0,0,0,0,]

In einem solchen Fall würde ich gerne die erste der gleichen Zahlen ignorieren und nur die zweite entsprechend behandeln.
Wie könnte man Deinen Code entsprechend anpassen?

Danke
Lisa
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bitte "nah beieinander" konkretisieren.

Eine Möglichkeit wäre:
Code:
nichtnull = find(x~=0);
nah = diff(nichtnull) < 3;
nichtnull(nah) = [];
y = x;
for I=1:numel(nichtnull)
    idx = nichtnull(I);
    y(idx:idx+3) = x(idx);
end


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 12.07.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2014, 18:42     Titel:
  Antworten mit Zitat      
Hallo

Mit 'nah beinander' meine ich, dass der Abstand zwischen den beiden Zahlen kleiner als das gewählte Intervall, i.e. 3, ist.

Danke für Deinen Vorschlag, der passt!

herzlichen Dank
Lisa
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.