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

Verschiebungsfunktion von Vektoren

 

Klausi24
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 20.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.07.2011, 10:20     Titel: Verschiebungsfunktion von Vektoren
  Antworten mit Zitat      
Hallo zusammen,

ich habe folgendes Problem mit der Circshift Funktion:

Beispiel:

Code:

f=Verschiebefaktor
B=[1 2 3 4 5];
A=circshift(B,[0 f]);
 


Der Vektor A ist der Vektor B um den Faktor f verschoben. Wenn ich ein Wert von f=6 annehmen ist das Ergebnis A=[5 1 2 3 4]. Es wird immer nach rechts verschoben und das fortlaufend

Die Verschiebung soll allerdings umgekehrt (Verschiebungsrichtung) werden, sobald die 1 an der Position 5 steht.

Das Ergebnis wäre bei der f=6 dann A=[4 5 1 2 3]. Es soll erst 4 Positionen nach rechts verschoben werden, dann zwei Positionen nach links.

Das soll auch in der laufenden Verschiebung realisiert werden.

Ist das möglich? Das ist echt kniffelig das ganze.

Hoffe das man mein Problem verstehen kann.

Vielen Dank im voraus für eure Hilfe.

Gruß Klausi
Private Nachricht senden Benutzer-Profile anzeigen


Klausi24
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 20.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2011, 13:49     Titel:
  Antworten mit Zitat      
Mhh hat keiner eine Idee? Vielleicht einen Ansatz der weiterentwickelt werden kann?

Das ist echt knifflig verdammt.
Private Nachricht senden Benutzer-Profile anzeigen
 
MatLabNooB
Forum-Guru

Forum-Guru


Beiträge: 262
Anmeldedatum: 27.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2011, 16:24     Titel:
  Antworten mit Zitat      
Hi, hier wäre eine möglichkeit:

Code:
f = 16;
B=[1 2 3 4 5];

A = B;
shiftMax = length(A)-1;
shiftCnt = 0;
direction = 1;
for shift = 1:f
    A = circshift(A,[0 direction]);
    shiftCnt = shiftCnt +1;
    if shiftCnt == shiftMax
        % change direction
         shiftCnt = 0;
         direction = -1*direction;
    end %if    
end % for
 

gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Klausi24
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 20.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2011, 18:48     Titel:
  Antworten mit Zitat      
Hey Matlabnoob,

vielen vielen Dank...das sieht echt gut aus...und klappt dazu auch noch! Smile

Danke nochmal

Gruß Klausi
Private Nachricht senden Benutzer-Profile anzeigen
 
Klausi24
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 20.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2011, 08:24     Titel:
  Antworten mit Zitat      
Hey ein Problem habe ich da noch.

Das Programm wird in eine Schleife eingebunden. f verändert sich damit kontinuierlich und und der zu Verschiebene Vektor.

Zum Beispiel sieht im zweiten Gesamtschleifen Durchlauf der Vektor
B=[4 5 1 2 3] aus.

Dann darf nciht mehr um Shiftmax= length(A)-1 vor einem Richtungswechsel verschoben werden, sondern nur noch um zwei Positionen bis B[23451] vorhanden ist.

Ich habe schon überlegt einen Wert im Vektor zu suchen und daran die "Verschiebesituation" zu ermitteln. Damit könnte man dann die max. Länge definieren--> Shiftmax=length(A)-Position(1) Allerdings kann es mehrere Postitionen mit den gleichen Werten geben. Zum Beispiel kann die eins öfters vorkommen.

Weiß da jemand einen Rat wie man das ganze Lösungen könnte?!

Beste Grüße, der Klausi
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 13.07.2011, 09:02     Titel:
  Antworten mit Zitat      
Bei mehreren 1er nimmst du doch sicherlich die letzte 1, die also bei Rechtsschieben dem Ende des Vektors am nächsten ist. Das wäre dann so:

Code:
Position = find(A==1,1,'last')


Jetzt kannst du Shiftmax wie angegeben bestimmen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Klausi24
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 20.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2011, 09:15     Titel:
  Antworten mit Zitat      
Hey DSP,

danke für die Antwort. Ne leider ist es nicht immer die letzte eins. Zu Beginn ist es halt die erste Position im Vektor. Im Laufe der Schleife kann diese dann sonst wo sein. Es können dann "Einsen" vor und nach dieser Position sein.

Kann man zum Beispiel die erste Position [1 2 3 4 5] anfangs irgendwie markieren und diese so verfolgen. Allerdings müssen es reelle, summierbare Zahlen bleiben.

Danke nochmal!

Gruß Klausi
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 13.07.2011, 09:25     Titel:
  Antworten mit Zitat      
Rechtsschieben soll doch so lange erfolgen, bis eine 1 am Ende ist. In dem Fall wird die Anzahl des Schiebens durch die letzte 1 im Vektor bestimmt. Wenn das erreicht wird, wird die Richtung umgedreht. Was passiert nun, wenn eine andere 1 beim Linksschieben am Ende steht? Willst du nur die 1 betrachten, die als erstes am Ende angekommen ist?

Edit: Du kennst doch durch die Anzahl der Schiebeoperationen ganz genau wo sich welche Zahl befindet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Klausi24
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 20.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2011, 09:48     Titel:
  Antworten mit Zitat      
nehmen wir einfach den folgenden Vektor an. Fettmarkiert ist die Anfangsposition, die die maximale Verschiebung angibt.

1. Durchlauf

f=1

[1 3 1 2 1]

Ergebnis: [1 1 3 1 2]

2. Durchlauf

f=2

Ausgehend vom Ergebnis von 1. soll um zwei Verschoben werden:

Ergebnis: [1 2 1 1 3]

3. Durchlauf:

f=3

Es wird das Ergebnis aus 2. genommen und um drei verschoben. Es darf aber nur um 1. nach rechts verschoben werden, weil die Fettmarkierte Position auf STelle 4 ist. Danach ändert sich die Richtung und es wird zwei nach links verschoben .

ERgebnis: [ 2 1 1 3 1]

Und das ganze soll mit allen Zahlenmöglichkeiten funktionieren. Man kann nicht immer vn der letzten zahl ausgehen.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 13.07.2011, 10:11     Titel:
  Antworten mit Zitat      
Sorry, vielleicht steh ich ja auf dem Schlauch...

Erst hast du folgendes Bsp genannt:

B=[4 5 1 2 3] mit find(B==1) finde ich die Position der 1 und kann damit shiftmax bestimmen

Nun dieses Bsp...heißt dass, du willst immer die erste 1 im Vektor nehmen und so lange nach Rechtsschieben bis sie am Ende ist. Dann umdrehen und die restlichen Schiebeoperationen durchführen bis f erreicht ist.

Beim zweiten Bsp ist
Code:
Position = find(A==1,1,'first')
. Willst du immer die erste 1 im Vektor betrachten und daran die Richtung vorgeben...alle anderen einer im Vektor sind somit für die Richtung nicht von belang Question
Private Nachricht senden Benutzer-Profile anzeigen
 
Klausi24
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 20.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2011, 11:38     Titel:
  Antworten mit Zitat      
Kein Problem, kann auch sein das ich vieles voraussetze was nur in meinem Kopf schwirrt Smile. Würde ich immer die erste eins nehmen dann würde es ja in dem zweiten Durchlauf schon nicht mehr klappen.

Es handelt sich im Prinzip um eine Ping Pong Funktion. Betrachtet wird im ersten Schleifendurchlauf die erste Position des Vektors. hier jetzt einfach Y das für einen belibigen Wert steht. Es werden nachher verschiedenste reelle Zahlen dafür stehen...deshalb geht die Funktion suche nach erstem letztem Wert nicht.

Startvektor: [Y x x x x ]

Dann wird dieser um f=3 verschoben. (maximal dürfte sich y um 4 verschieben. Bei 5 würde es schon wieder umkehren)

Ergebniss der Schleife ist:
[xxxyx]

Dieses Ergebnis (immer Bezug auf das vorhergehende Schleifenergebnis) wird im nächsten Schleifendurchlauf nochmals um f=3 verschoben. Y kann dabei nur um einen nach rechts und wird dann wieder zwei nach links verschoben Ergebniss: [xxyxx]. (Maximal kann y sich um einen nach rechts verschieben, dann wird umgedreht)

Es geht hier also nicht um irgendwelche Zahlenwerte, esdas programm darf sich höchstens um vier postionen nach rechts verschieben, dann muss es sich wieder nach links averschieben. Aber höchstens vier mal, dann wierd wieder gewechselt. . Allerdings Ist die maximale Verschiebung immer von dem der y postion abhängig. Vielen dank für deine Hilfe und deine GEduld.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.07.2011, 11:52     Titel:
  Antworten mit Zitat      
Hallo

du muss ja nicht unbedingt Ausgangsvektor verschieben sondern du kannst auch Indexvektor nehmen. Dort kannst du dann die Position von 1 überprüfen.
Also ich meine folgendes
Code:

f=1;
B=[1 3 1 2 1];
A=1:numel(B);
S=circshift(A,[0 f])
B(S)
 


Außerdem, wenn du genau kennst wie viele Male nach rechts und wie viele Male nach Rechts gehts warum vorgibst du nicht gleich Richtungen

so z.B:
Code:

direction= [1 1 1 1 -1 -1]; % 4 mal recht 2 mal links
B=[1 3 1 2 1];
A=1:numel(B);
D= zeros(numel(direction),numel(B));
c=1;
for d=direction
  A=circshift(A,[0 d])
  D(c,:)=A;
  c=c+1;
end
B(D)

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Klausi24
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 20.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.07.2011, 12:22     Titel:
  Antworten mit Zitat      
Programmaufbau ist folgendermaßen. Es gibt eine innere Schleife (verschiebung) und eine äußere (die verändert f).
Code:

f = 16;
B=[1 2 3 4 5];
X=2000

A = B;
shiftMax = length(A)-1;
shiftCnt = 0;
direction = 1;

for 1:X

% fortlaufende Veränderung von f innerhalb der übergeordneten schleife

for shift = 1:f

    A = circshift(A,[0 direction]);
    shiftCnt = shiftCnt +1;
    if shiftCnt == shiftMax
        % change direction
         shiftCnt = 0;
         direction = -1*direction;

    end %if    
 
end % for
   

end % Ende der übergeordneten Forschleife
 


Nach durchlaufen der inneren Schleife ergibt sich ein neuer Vektor. In der übergeordneten Schleife wird ein neues f berechnet. Dieses f wird wieder für die Schleife verwendet. Ausgangsvektor für die innere Schleife ist das Ergebnis des vorherigen schleifen durchlaufs. Das ganze wird etlichhundertemale durchlaufen. Ich kann also nicht genau für jede schleife angeben wie sich der vektor zu verschieben hat. Im Prinzip muss die Innere Schleife immer den Vektor als ERgebnis ausspucken, die zulsetzt verwendete direction und die position des fiktiven wertes"y". Die darauffolgende innere schleife mit neuem f muss auf dieser grundlage dann eine nächste verschiebung vornehmen usw. usw. bis die übergehordnete schleife X durchl durchläufe gemacht hat.
Private Nachricht senden Benutzer-Profile anzeigen
 
Klausi24
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 20.04.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2011, 11:45     Titel:
  Antworten mit Zitat      
Hey liebe Leute,

was meint ihr, ist dass oben genannte generell möglich? Ich komme da nicht zu einem clue.

Gibts eine Möglichkeit, ein Element in einem Vektor zu markieren. Zum Beispiel, das fünfte Elemten eines Vektors wird mit einem Befehl "rot". Dieses Element wird innerhalb des Vektors wie oben beschrieben, zusammen mit dem kompletten Vekto,r verschoben. Ist es dann möglich die Postion des Elemtes welches rot ist zu finden? Mit der find Funktion zum Beispiel?

Bsp Pseudocode:

Markiere erstes Element im Vektor rot.

Verschiebe den Vektor nach Verschiebemechanismus


Finde die Position, an der sich das "Rote" Element befindet.


Vielleicht hat ja noch einer eine Idee. Danke auf jedenfall schonmal für die Hilfe!

LG Klausi
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.07.2011, 15:46     Titel:
  Antworten mit Zitat      
Die 1 spielt ping-pong und m sagt dir am Ende, an welche Stelle sie steht, als die Spieler aufgehört haben...und das alles ohne markieren. Man muss doch nur mitzählen Wink

Code:

f = 15;
 B=[1 2 3 4 5];

 A = B;
 shiftMax = length(A)-1;
 shiftCnt = 0;
 m=1;
 direction = 1;
for shift = 1:f
     A = circshift(A,[0 direction])
     shiftCnt = shiftCnt + 1;
     if direction == 1 % vorwärts
         m = m + 1;
     elseif direction == -1 % rückwärts
         m = m - 1;
     end
     if shiftCnt == shiftMax
         % change direction
          shiftCnt = 0;
          direction = -1*direction;
     end %if    
end % for
 


Edit: Deine vorherigen Bsp. bzgl. mehreren 1er ist mir aber immer noch nicht klar. Du musst doch irgendeine 1 am Start definieren, die hin und her wandern soll. Wenn ich in diesem Bsp. shiftCnt mit 1 initialisiere, wandert eben die 2 hin und her.
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.