Circshift the columns of an array with different shiftsize withou using for loop
이전 댓글 표시
As the tittle suggests I am wondering if it is possible to circshift the columns of an array with a different shiftsize in each column without using a for loop.
Example:
a=randi(10,5,4);
I want to do this
a(:,4)=circshift(a(:,4),[-1 0]);
a(:,3)=circshift(a(:,3),[-2 0]);
without a loop. Is it possible?
댓글 수: 6
Azzi Abdelmalek
2013년 6월 15일
a=randi(10,5,4); % the size of a is [5 4] , which means a(:,5) does not exist
Giorgos Papakonstantinou
2013년 6월 15일
편집: Giorgos Papakonstantinou
2013년 6월 15일
Azzi Abdelmalek
2013년 6월 15일
But it still not clear, when it starts and when it ends
Giorgos Papakonstantinou
2013년 6월 15일
Giorgos Papakonstantinou
2013년 6월 15일
Matt J
2013년 6월 15일
In your example, you modify 'a' in-place. If that's really what you're after, for-loops are going to be pretty competitive. Notice that no iteration of your loop ever allocates any additional memory larger than 1 column a(:,uu). I think there are tools on the FEX that can get rid of even that.
채택된 답변
추가 답변 (2개)
Andrei Bobrov
2013년 6월 15일
편집: Andrei Bobrov
2013년 6월 16일
[m,n] = size(a);
b = rem(shiftindex-1,m)+1;
c = rem(bsxfun(@plus,m + 1 - b - m*(b == 0),(0:m-1)')-1,m)+1;
out = a(bsxfun(@plus,c,m*(0:n-1)));
댓글 수: 4
Matt J
2013년 6월 15일
This solution doesn't use n at all and therefore only seems to make shifted copies of the first column of a:
a =
1 6 11 16
2 7 12 17
3 8 13 18
4 9 14 19
5 10 15 20
out =
5 4 3 1
1 5 4 2
2 1 5 3
3 2 1 4
4 3 2 5
Matt J
2013년 6월 15일
I think maybe this was the idea
[m,n] = size(a);
b=mod(bsxfun(@plus,(0:m-1).',-shiftindex(:).' ),m)+1;
b=bsxfun(@plus,b,(0:n-1)*m);
out = a(b)
Giorgos Papakonstantinou
2013년 6월 16일
Giorgos Papakonstantinou
2013년 6월 15일
카테고리
도움말 센터 및 File Exchange에서 z-transforms에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!