I want to shift a part of a row vector to the right then adding a number before the shifted part
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
Mohamed Salah
el 15 de Mayo de 2020
Editada: Mehmed Saad
el 17 de Mayo de 2020
assuming I have
a=[1 2 3 4 0 0];
b=[0 0 1 0]
I want 'a' to be
a=[1 2 3 1.5 4 0]
the 1.5 is half the element before
and b indicates when does the shift occur
0 comentarios
Respuesta aceptada
Mehmed Saad
el 15 de Mayo de 2020
Editada: Mehmed Saad
el 15 de Mayo de 2020
if b contains only 1 shift
ind = find(b);
a(ind+1:end)=circshift(a(ind+1:end),1);
a(ind+1) = a(ind)/2;
a =
1.0000 2.0000 3.0000 1.5000 4.0000 0
4 comentarios
Mehmed Saad
el 17 de Mayo de 2020
Editada: Mehmed Saad
el 17 de Mayo de 2020
Instead of padding zeros at the end of vector a use the following strategy
- Donot pad zeros at the end of a
- pad zeros in b such that length of a is equal to length of b
- replace all the zeros in b with NaN
- repeat a in 2nd dimension for example if a is [1 2] then after repeating it in 2nd dimension it will be [1 2;1 2]
- multiply 2nd row(repeated) with b and divide it by 2
- remove all the NaNs and remaining part will be your answer
a = [1 2 3 4 5 6];
b = [1 1 1 1];
b = [b zeros(1,length(a)-length(b))]; %Making a and b equal in length
b(b==0) = nan;% replacing all zeros in b with NaNs
a = repmat(a,2,1);% repeating the vector array across 2nd dimension
a(2,:) = (a(2,:).*b)/2;% multiplying 2nd row with b and dividing it by 2
a=a(~isnan(a))% index elements which are with out NaNs
The value of a will be
a =
1.0000 0.5000 2.0000 1.0000 3.0000 1.5000 4.0000 2.0000 5.0000 6.0000
similarly for
a = [ 1 2 3 4 0];
b = [0 1 0 0];
Result will be
a =
1.0000 2.0000 3.0000 1.5000 4.0000 0
Hope this works
Más respuestas (0)
Ver también
Categorías
Más información sobre Logical 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!