Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

How to "stretch" matrix

Asked by Daniel on 21 Apr 2012

Hello,

I was wondering if MATLAB had a function for doing the following. Say I have the following vector:

[1 1 2 2 0 0]

And I want to make a new vector which contains 1.5 times the amount of the present elements, i.e. "stretch" it by 1.5

[1 1 1 2 2 2 0 0 0]

Just asking before writing any buggy, inneficient code.

regards,

Daniel

2 Comments

James Tursa on 21 Apr 2012

Is it always adding one more element of each? Or by "1.5 times" do you mean that you have a larger problem in mind like [1 1 1 1 2 2 2 2 0 0 0 0] etc and would like the solution to be [1 1 1 1 1 1 2 2 2 2 2 2 0 0 0 0 0 0] etc? I.e., how generic is your real problem?

Walter Roberson on 21 Apr 2012

Will the number of identical elements in a row always be the same?

Daniel

Products

No products are associated with this question.

3 Answers

Answer by Andrei Bobrov on 21 Apr 2012
a = [1 1 2 2 0 0];
t = 1.5
k=[true,diff(a)~=0];
k2 = find(k);
k3 = [k2(2:end)-1 numel(k)];
k4 =  k3-k2+1;
m = round(k4*t);
if all(diff(m) == 0)
    out = reshape(ones(m(1),1)*a(k),1,[]);
else
    out = cell2mat(arrayfun(@(x,y)x(ones(1,y)),a(k),m,'un',0));
end

ADD on Walter's comment

out = kron(a(1:2:end),ones(1,t*2))

2 Comments

Walter Roberson on 21 Apr 2012

You forgot the kron() call :-)

Andrei Bobrov on 21 Apr 2012

Thank you Walter!

Andrei Bobrov
Answer by Image Analyst on 21 Apr 2012

Daniel, if you have the Image Processing Toolbox, you can do it in one single, and very simple, line of code:

% Create sample data.
m1 = [1 1 2 2 0 0]
% Now do the replication like Daniel wants.
m2 = imresize(m1, [1 9], 'nearest')

In the command window:

m1 =
     1     1     2     2     0     0
m2 =
     1     1     1     2     2     2     0     0     0

Of course you can change the 9 to be any length you want your output vector to be.

1 Comment

Richard Brown on 21 Apr 2012

That's sneaky ...

Image Analyst
Answer by Richard Brown on 21 Apr 2012

Further to Image Analyst's answer, you can do it without the image processing toolbox too (assuming m has an even number of entries)

m = [1 1 2 2 0 0 ];
n = numel(m);
m2 = interp1(1:n, m, linspace(1, n, 1.5*n), 'nearest')

0 Comments

Richard Brown

Contact us