9 views (last 30 days)

I wonder if it's possible to pad a vector with intermediate points in order to make it more "smooth" in an elegant way (i.e. with no loops)

% Example:

a=[1.1 5.2 9.25 10];

a_desired=[1.1 2.125 3.15 4.175 5.2 5.2 6.55 7.9 9.25 9.25 9.625 10];

a_desired which was generated by:

a_desired=[linspace(a(1), a(2), 5), linspace(a(2), a(3), 4), linspace(a(3), a(4), 3)]

So, what I need is some kind of generalized linspace(), which works not only with begin and end of an interval, but allows the control of the number of points between the "node points" on the interval, where the "node points" are the begin, the end and some points in between.

In the above example, the number of entries in a is known in advance, so it's possible to use linspace() together with concatenation without any loops. But what if a is a generic vector generated by some calculation? Then I end up using loops:

a_desired=[];

for j=1:1:length(a)-1

a_desired=[a_desired, linspace(a(j), a(j+1), NUMBER_OF_PTS)];

end

which affects the performance (even if I preallocate a_desired, it still will be not very nice and not very fast).

W. Owen Brimijoin
on 2 May 2014

If you find regular array operations more straightforward to follow than cell functions, you could create an array that increases in each column by the amount you need it to, and then unfold it back to a vector like this:

a=[1.1 5.2 9.25 10];

n_pts = 4; %specify the number of intervening points

a_desired = cumsum([a;repmat([diff(a)/n_pts,0],n_pts-1,1)]);

a_desired = a_desired(1:end-n_pts+1);

Something like that?

Kelly Kearney
on 1 May 2014

If you have the Mapping Toolbox, interpm will do that:

a2 = interpm(a, ones(size(a)), 1.025)

It's not exactly the same as your linspace example, since you set the minimum interval instead of the number of points.

Joseph Cheng
on 1 May 2014

you can try to use cellfun

here is a quick thing i created using your example up top. You will have to play around with it a bit to optimize it or see if the for loop is more efficient (memory wise).

a=[1.1 5.2 9.25 10]; %example a value.

%create pairs to be linspaced

a1 = a(1:end-1)';

a2 = a(2:end)';

%make pairs cells

a1 = mat2cell(a1,ones(size(a1)));

a2 = mat2cell(a2,ones(size(a2)));

%use cellfun to do the loops for you

a3=cellfun(@(x,y) linspace(x,y,100)',a1,a2,'UniformOutput',false);

a4 = cell2mat(a3)'

now a quick test shows that the stuff above, for an array that is longer than 500 elements, is faster than using the for loop you have in your question. (for me at least) there will be some variations when you vary the numbers of padding in linspace and number of items in 'a';

Joseph Cheng
on 1 May 2014

to get rid of the duplicates

a4 = cell2mat(a3)'

a4(100:100:length(a4)-1)=[]

which should erase the the first duplicate value and the length()-1 should stop it from deleting the last spot.

Opportunities for recent engineering grads.

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

Start Hunting!
## 6 Comments

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211239

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211239

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211245

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211245

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211249

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211249

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211251

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211251

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211256

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211256

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211424

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/127757-pad-vector-between-its-values#comment_211424

Sign in to comment.