Replace repeatative values by using interpolation ?

3 visualizzazioni (ultimi 30 giorni)
Hi Matlabers ,
I have a vector which has repeatative values from 0 to 1.
I want to relace those repeataive values by using interpolated values in matlab script. As a result, I will have no any repeatative value and the plot/ and curve of that vector will be smooth.
Thanks in advance.

Risposta accettata

Ameer Hamza
Ameer Hamza il 14 Mar 2020
Try this
x = [0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1]'; % generate random data
indexes = [1; find(x(2:end) - x(1:end-1))+1];
x_new = zeros(size(x));
for i=1:numel(indexes)-2
x_new(indexes(i):indexes(i+1)) = interp1([0 1], x(indexes([i i+1])), linspace(0, 1, indexes(i+1)-indexes(i)+1));
end
x_new(indexes(end-1):end) = interp1([0 1], x([indexes(end-1) end]), linspace(0, 1, numel(x)-indexes(end-1)+1));
  2 Commenti
Koustubh Shirke
Koustubh Shirke il 14 Mar 2020
Hi Ameer,
Thanks for the answe. Its really helpfu.
It seems , it keeps first value of start of any duplicate. Can I also shift it to centre ? So that I will keep all centred value of duplictaes and then interploate remained ?
Ameer Hamza
Ameer Hamza il 14 Mar 2020
try something like this
x = [0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0]'; % generate random data
indexes = find(x(2:end) - x(1:end-1))+1;
indexes = floor(movmean(indexes, 2, 'Endpoints', 'discard'));
x_new = zeros(size(x));
x_new(1:indexes(1)) = interp1([0 1], x([1 indexes(1)]), linspace(0, 1, indexes(1)));
for i=1:numel(indexes)-1
x_new(indexes(i):indexes(i+1)) = interp1([0 1], x(indexes([i i+1])), linspace(0, 1, indexes(i+1)-indexes(i)+1));
end
x_new(indexes(end):end) = interp1([0 1], x([indexes(end) end]), linspace(0, 1, numel(x)-indexes(end)+1));

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Creating and Concatenating Matrices in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by