Shift array to left or right, keep length and feel zero empty area
조회 수: 601 (최근 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
댓글 수: 2
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!