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

New to MATLAB?

How to "stretch" matrix

Asked by Daniel

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

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

Walter Roberson

on 21 Apr 2012

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

Daniel

Daniel

Products

No products are associated with this question.

3 Answers

Answer by Andrei Bobrov

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

Walter Roberson

on 21 Apr 2012

You forgot the kron() call :-)

Andrei Bobrov

Andrei Bobrov

on 21 Apr 2012

Thank you Walter!

Andrei Bobrov

Andrei Bobrov

Answer by Image Analyst

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

Richard Brown

on 21 Apr 2012

That's sneaky ...

Image Analyst

Image Analyst

Answer by Richard Brown

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

Richard Brown

Contact us