Circshift the columns of an array with different shiftsize withou using for loop

8 views (last 30 days)
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 Comments
Matt J
Matt J on 15 Jun 2013
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.

Sign in to comment.

Accepted Answer

Matt J
Matt J on 15 Jun 2013
Edited: Matt J on 15 Jun 2013
[m,n]=size(a);
S=full(sparse(mod(shiftindex,m)+1,1:n,1,m,n));
a_new=ifft(fft(a).*fft(S),'symmetric')
  4 Comments
Matt J
Matt J on 15 Jun 2013
Edited: Matt J on 15 Jun 2013
a_new does not consist of exact integers. There are floating point residuals due to the fft/ifft operations used to transform a.

Sign in to comment.

More Answers (2)

Andrei Bobrov
Andrei Bobrov on 15 Jun 2013
Edited: Andrei Bobrov on 16 Jun 2013
[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 Comments
Giorgos Papakonstantinou
Giorgos Papakonstantinou on 16 Jun 2013
Indeed Matt thee solution was making shifted copies of the first column. What you proposed last does the shifting correctly. I have question in your second solution.
What is the purpose of the dots in the second line? When you want to square the elements of a matrix you have to put the dot in order this to do it elementwise. But bsxfun is doing the same operation, I think.
Matt J
Matt J on 17 Jun 2013
Edited: Matt J on 17 Jun 2013
What is the purpose of the dots in the second line?
Not sure which "dots" you mean. I think you know what the dots in (0:m-1) does. The colon operator produces a vector 0,1,2,..m-1.

Sign in to comment.


Giorgos Papakonstantinou
Giorgos Papakonstantinou on 15 Jun 2013
Where is Anrei's answer??? It was here before 2 minutes ago.
Is an answer deleted after accepting a previous one?
I had some question on it that why?
He proposed this:
[m,n] = size(a);
out = a(bsxfun(@plus,toeplitz(1:m,[1,m-(0:n-2)]),(0:n-1)*m));
Apart from the fact that its hardcore, my question would be what would be the case if the shiftindex was not linear..
ex.
shiftindex=[2 2 10 5];

Categories

Find more on Resizing and Reshaping Matrices in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!