2016-06-01 7 views
3

Ich war auf der Suche nach einer Möglichkeit zum circshift mit Indexwerten.circshift mit Indexwerten

Ich weiß, ich kann alle Werte verschieben die circshift Befehl unter

a=[1:9] 
b=circshift(a,[0,1]) 

siehe Verwendung Aber wie verschiebe ich jeden 3. Wert über 1? Beispiel: Hinweis: Variable a können beliebig lang sein

a=[1,2,30,4,5,60,7,8,90] %note variable `a` could be any length 

Ich versuche b zu bekommen

b=[1,30,2,4,60,5,7,90,8] % so the values in the index 3,6 and 9 are shifted over 1. 

Antwort

3

Sie sein werden in der Lage sein, dies zu tun nicht mit der Standard Verwendung von . Es gibt ein paar andere Möglichkeiten, wie Sie das angehen könnten. Hier sind nur ein paar.

mod Index erstellen mit den Werten

Sie mod verwenden könnten 1 aus den Indexwerten an Stellen zu subtrahieren 3:3:end und fügen 1 zu den Indexwerten an Orten 2:3:end.

b = a((1:numel(a)) + mod(1:numel(a), 3) - 1); 

Erklärung

Aufruf mod 3 auf 1:numel(a) ergibt die folgende Sequenz

mod(1:numel(a), 3) 
% 1  2  0  1  2  0  1  2  0 

Wenn wir 1 von dieser Sequenz subtrahieren wir die "shift" für einen bestimmten Index

mod(1:numel(a), 3) - 1 
% 0  1 -1  0  1 -1  0  1 -1 
erhalten

Dann können wir diese Verschiebung auf den ursprünglichen Index

(1:numel(a)) + mod(1:numel(a), 3) - 1 
% 1  3  2  4  6  5  7  9  8 

hinzufügen und dann die Werte in a zu diesen Positionen in b zuweisen.

b = a((1:numel(a)) + mod(1:numel(a), 3) - 1); 
% 1 30  2  4 60  5  7 90  8 

Mit reshape.

Eine andere Möglichkeit besteht darin, Ihre Daten in ein 3 x N Array umzuformen und die zweite und dritte Zeile umzudrehen und dann wieder auf die ursprüngliche Größe umzuformen. Diese Option funktioniert nur, wenn numel(a) durch 3 teilbar ist.

tmp = reshape(a, 3, []); 

% Grab the 2nd and 3rd rows in reverse order to flip them 
b = reshape(tmp([1 3 2],:), size(a)); 
+0

Ich bemerke, wenn ich einen anderen Wert zu 'a' hinzugefügt habe, scheint es nicht zu funktionieren, gibt es eine Arbeit um? Ich habe die Frage aktualisiert, um eine Notiz hinzuzufügen, dass die Variable "a" beliebig lang sein kann. –

+0

@RickT Wirklich? Die erste Lösung funktioniert nicht? Es sollte für jede Größe von a funktionieren. Die zweite Lösung * ist * abhängig von der Größe. Ich habe eine Erklärung hinzugefügt, um dies zu verdeutlichen. – Suever

+0

Ich bekomme eine Fehlermeldung mit der ersten. Fehler: Ungültige Größenänderung Operation oder mehrdeutige Zuordnung zu einem Out-of-Bound-Array-Element Das ist, was ich ausprobiert –