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

21 Ansichten (letzte 30 Tage)
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!

Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 7 Jan. 2014
Bearbeitet: Andrei Bobrov am 7 Jan. 2014
r = rem(random,10);
c = [cycle,cycle];
out = c(bsxfun(@plus,bsxfun(@plus,10 - r,0:9)*5,(1:5)'));

Weitere Antworten (2)

Azzi Abdelmalek
Azzi Abdelmalek am 7 Jan. 2014
id=randi(size(cycle,2),1,size(cycle,1))
out=cell2mat(arrayfun(@(x) circshift(cycle(x,:),[1 id(x)]),(1:numel(id))','un',0))

Matt J
Matt J am 7 Jan. 2014
Bearbeitet: Matt J am 7 Jan. 2014
One way,
round(ifft(fft(cycle,[],2) .* exp(-2i*pi/10*random(:)*(0:9)) ,[],2) )
  3 Kommentare

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by