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 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Tim
el 7 de En. de 2014
Comentada: Miguel Reina
el 25 de Dic. de 2017
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!
0 comentarios
Respuesta aceptada
Andrei Bobrov
el 7 de En. de 2014
Editada: Andrei Bobrov
el 7 de En. de 2014
r = rem(random,10);
c = [cycle,cycle];
out = c(bsxfun(@plus,bsxfun(@plus,10 - r,0:9)*5,(1:5)'));
2 comentarios
Miguel Reina
el 25 de Dic. de 2017
if i have a 577x721 how can i shift the rows from 0 to 576? is like a diagonal shift.
Más respuestas (2)
Azzi Abdelmalek
el 7 de En. de 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))
Ver también
Categorías
Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!