I want to shift a part of a row vector to the right then adding a number before the shifted part
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Mohamed Salah
le 15 Mai 2020
Modifié(e) : Mehmed Saad
le 17 Mai 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 commentaires
Réponse acceptée
Mehmed Saad
le 15 Mai 2020
Modifié(e) : Mehmed Saad
le 15 Mai 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 commentaires
Mehmed Saad
le 17 Mai 2020
Modifié(e) : Mehmed Saad
le 17 Mai 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
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Logical dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!