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 次查看(过去 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!
0 个评论
采纳的回答
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 个评论
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
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))
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!