Effacer les filtres
Effacer les filtres

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

22 vues (au cours des 30 derniers jours)
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!

Réponse acceptée

Andrei Bobrov
Andrei Bobrov le 7 Jan 2014
Modifié(e) : Andrei Bobrov le 7 Jan 2014
r = rem(random,10);
c = [cycle,cycle];
out = c(bsxfun(@plus,bsxfun(@plus,10 - r,0:9)*5,(1:5)'));
  2 commentaires
Tim
Tim le 8 Jan 2014
Thanks a lot, when I tested all the solutions this one was the fastest! ;-)
Miguel Reina
Miguel Reina le 25 Déc 2017
if i have a 577x721 how can i shift the rows from 0 to 576? is like a diagonal shift.

Connectez-vous pour commenter.

Plus de réponses (2)

Azzi Abdelmalek
Azzi Abdelmalek le 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 le 7 Jan 2014
Modifié(e) : Matt J le 7 Jan 2014
One way,
round(ifft(fft(cycle,[],2) .* exp(-2i*pi/10*random(:)*(0:9)) ,[],2) )
  3 commentaires
Matt J
Matt J le 7 Jan 2014
It's just fft's and ifft's. Should work fine.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by