Shift array to left or right, keep length and feel zero empty area
626 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Nik Rocky
el 6 de Dic. de 2020
Respondida: Steven Lord
el 13 de Nov. de 2023
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 comentarios
Respuesta aceptada
Cris LaPierre
el 6 de Dic. de 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 comentarios
Stephen23
el 12 de Nov. de 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
Más respuestas (2)
Aamod
el 13 de Oct. de 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 comentarios
Steven Lord
el 13 de Nov. de 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 comentarios
Ver también
Categorías
Más información sobre Matrix Indexing en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!