필터 지우기
필터 지우기

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 (최근 30일)
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!

채택된 답변

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

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Azzi Abdelmalek
Azzi Abdelmalek 2014년 1월 7일
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 2014년 1월 7일
편집: Matt J 2014년 1월 7일
One way,
round(ifft(fft(cycle,[],2) .* exp(-2i*pi/10*random(:)*(0:9)) ,[],2) )
  댓글 수: 3

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by