Shift array to left or right, keep length and feel zero empty area
607 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Cris LaPierre
2020-12-6
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 个评论
Stephen23
2023-11-12
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
更多回答(2 个)
Aamod
2023-10-13
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
Steven Lord
2023-11-13
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 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!