# Shift array to left or right, keep length and feel zero empty area

812 views (last 30 days)
Nik Rocky on 6 Dec 2020
Answered: Steven Lord on 13 Nov 2023 at 20:14
Hello,
I have an array:
A = [1 2 3 4 5 6 7 8 9];
I want create B array from A
B = [0 0 1 2 3 4 5 6 7];
or
B = [3 4 5 6 7 8 9 0 0];
How it is possible?
circshift dont feel zeros

Cris LaPierre on 6 Dec 2020
I'm not aware of a function that will do exactly what you describe. However, the final result is still possible if you are willing to break the process up into steps.
A = [1 2 3 4 5 6 7 8 9];
B = zeros(size(A));
B(3:end) = A(1:7)
B = 1×9
0 0 1 2 3 4 5 6 7
% or
n = -2;
B = circshift(A,n);
if n>0
B(1:n) = 0
else
B(end+n+1:end) = 0
end
B = 1×9
3 4 5 6 7 8 9 0 0
Nik Rocky on 6 Dec 2020
Beautiful! Thank you so much!
Stephen23 on 12 Nov 2023 at 12:14
Note that the IF..ELSE..END can be replaced with one line:
A = 1:9;
n = -2;
B = circshift(A,n);
B([1:n,end+n+1:end]) = 0
B = 1×9
3 4 5 6 7 8 9 0 0
n = +2;
B = circshift(A,n);
B([1:n,end+n+1:end]) = 0
B = 1×9
0 0 1 2 3 4 5 6 7

Aamod on 13 Oct 2023
Same code for a 2D matrix - shift by shift values and zero pad the extra area.
Eout = circshift(Ein,[shifty shiftx]);
if shiftx <0
Eout(:,(end+shiftx):end)= 0;
else
Eout(:,(1:shiftx))= 0;
end
if shifty <0
Eout((end+shifty):end,:)= 0;
else
Eout((1:shifty),:)= 0;
end
Enzo on 12 Nov 2023 at 10:15
Thanks a lot, it helped me ! Aamod on 13 Nov 2023 at 19:54
Wonderful!

Steven Lord on 13 Nov 2023 at 20:14
If you're using release R2023b or later you could use paddata.
A = [1 2 3 4 5 6 7 8 9];
B = 1×9
0 0 1 2 3 4 5 6 7
C = paddata(A(3:end), numel(A)) % Default is Side="trailing"
C = 1×9
3 4 5 6 7 8 9 0 0
If you object to the fact that I hard-coded "1:end-2" and "3:end":
n = 2;
B = 1×9
0 0 1 2 3 4 5 6 7
C = 1×9
3 4 5 6 7 8 9 0 0