Shift array to left or right, keep length and feel zero empty area
711 views (last 30 days)
Show older comments
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
0 Comments
Accepted Answer
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)
% or
n = -2;
B = circshift(A,n);
if n>0
B(1:n) = 0
else
B(end+n+1:end) = 0
end
2 Comments
Stephen23
on 12 Nov 2023
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
n = +2;
B = circshift(A,n);
B([1:n,end+n+1:end]) = 0
More Answers (2)
Aamod
on 13 Oct 2023
Same code for a 2D matrix - shift by shift values and zero pad the extra area.
function Eout = circshiftzeropad(Ein,shifty,shiftx)
%function Eout = circshiftzeropad(Ein,shifty,shiftx)
%shifts and zeropads an array
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
2 Comments
Steven Lord
on 13 Nov 2023
A = [1 2 3 4 5 6 7 8 9];
B = paddata(A(1:end-2), numel(A), Side="leading")
C = paddata(A(3:end), numel(A)) % Default is Side="trailing"
If you object to the fact that I hard-coded "1:end-2" and "3:end":
n = 2;
B = paddata(A(1:(end-n)), numel(A), Side="leading")
C = paddata(A((1+n):end), numel(A))
0 Comments
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!