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

Learn moreOpportunities for recent engineering grads.

Apply Today
Asked by Hello kity on 12 Dec 2012

I have an array with 0 s and 1s.

Example a colomn, 0 ,0 ,0 ,0 , 1.

Now the 1 is on the 5th row, I want to raise that to the first row.

So, in my code i want all the ones to go 4 steps up...

sounds easy, but how :) ?

*No products are associated with this question.*

Answer by Walter Roberson on 12 Dec 2012

Edited by Walter Roberson on 12 Dec 2012

Have you considered circshift() up by 4 rows?

Answer by Azzi Abdelmalek on 12 Dec 2012

A=[0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1] for k=5:length(A) if A(k) b=A(k-4:k-1); A(k-4)=1 A(k-4+1:k)=b end end

Hello kity on 12 Dec 2012

Would you comment this code step by step, I dont get how you do this...

thank you

Azzi Abdelmalek on 12 Dec 2012

A=[0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1] for k=5:length(A) if A(k) % If A(k) is equal to 1 b=A(k-4:k-1); % store value from k-4 to k-1 in b A(k-4)=1 % replace value at k-1 by 1 A(k-4+1:k)=b % shift value stored in b end end

Answer by Andrei Bobrov on 12 Dec 2012

Edited by Andrei Bobrov on 12 Dec 2012

other way:

a - your vector - row (eg: [0 0 0 0 1])

n = numel(a); out = a(hankel(1:n,[n,1:n-1]));

or

out = hankel(a,circshift(a,[0 1]));

Answer by Jan Simon on 12 Dec 2012

Edited by Jan Simon on 12 Dec 2012

Some ideas:

x = [0, 0, 0, 0, 1]; index = find(x, 1, 'first'); y1 = x(index:end); y2 = [x(index:end), zeros(1, index - 1)]; y3 = [x(index:end), ones(1, index - 1)]; y4 = [x(index:end), repmat(x(end), 1, index - 1)]; y5 = [x(index:end), x(1:index - 1)];

## 5 Comments

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/56371#comment_116684

What if there is a 1 in the first 4 columns?

Also, should the new matrix have fewer columns?

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/56371#comment_116685

Then what should be left in 5th column (or row in your words) ?

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/56371#comment_116704

@Student: The question remains, what "raise to the first row" exactly means. At first I guess it is the "first column", but "raising" can be swapping, shifting, circular shifting, sorting, cropping or any procedure I cannot imagine currently.

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/56371#comment_116710

I meant shifting, shifting the 1 on the 4th row to the 1st.

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/56371#comment_116721

Thanks for the clarification, Student. And what happens on the right margin? Is the result shorter, filled with zeros or ones or with the value of the last element?