How to shift rows in a matrix by different values (e.g. line 1 n-spots, line 2 m-spots and so on) without using a loop

I want to shift rows in a matrix randomly. It is im important that every row in shiftet by a random number. I tried to implement it like this but it didn't work. (I could use a loop but that would take too long I guess (I've large amount of data))
cycle=repmat([ones(1,3),zeros(1,7)],5,1); %Matrix with 10 rows that I want to shift
cycle =
1 1 1 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0
random=round(rand(10,1).*10); % Random values for the shifting for each row
random =
4
6
5
6
9
result=circshift(cycle, [0, random]) % That does not work...
The result would be: result=
cycle =
0 0 0 0 1 1 1 1 0 0 %shifted by 4
0 0 0 0 0 0 1 1 1 1 %shifted by 6
0 0 0 0 0 1 1 1 1 0 %shifted by 5
0 0 0 0 0 0 1 1 1 1 %shifted by 6
1 1 1 0 0 0 0 0 0 1 %shifted by 9
Should i better use another function or what would be the easiest way?
Thanks!

 Accepted Answer

r = rem(random,10);
c = [cycle,cycle];
out = c(bsxfun(@plus,bsxfun(@plus,10 - r,0:9)*5,(1:5)'));

2 Comments

Thanks a lot, when I tested all the solutions this one was the fastest! ;-)
if i have a 577x721 how can i shift the rows from 0 to 576? is like a diagonal shift.

Sign in to comment.

More Answers (2)

id=randi(size(cycle,2),1,size(cycle,1))
out=cell2mat(arrayfun(@(x) circshift(cycle(x,:),[1 id(x)]),(1:numel(id))','un',0))
One way,
round(ifft(fft(cycle,[],2) .* exp(-2i*pi/10*random(:)*(0:9)) ,[],2) )

3 Comments

wow, I've never seen this function. But does it also work it I've larger data? Couldn't apply it to my model yet...For the data above it works fine
cycle=repmat([ones(1,8),zeros(1,24)],10,1440/32); %each row always has 1440 elements (collums), there might be between 1 and 10000 rows (so the amount of rows should be flexible, here: n=10)
The rows can be shifted by (in this case) a number randomly between [0 - m] (this should also stay flexible, in my model e.g. m=32)
Is it possible to adapt this function? Thanks a lot!

Sign in to comment.

Categories

Asked:

Tim
on 7 Jan 2014

Commented:

on 25 Dec 2017

Community Treasure Hunt

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

Start Hunting!