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

8 次查看(过去 30 天)
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 个评论
Matt J
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.

请先登录,再进行评论。

采纳的回答

Matt J
Matt J 2013-6-15
编辑:Matt J 2013-6-15
[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 个评论
Matt J
Matt J 2013-6-15
编辑:Matt J 2013-6-15
a_new does not consist of exact integers. There are floating point residuals due to the fft/ifft operations used to transform a.

请先登录,再进行评论。

更多回答(2 个)

Andrei Bobrov
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 个评论
Giorgos Papakonstantinou
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 2013-6-17
编辑:Matt J 2013-6-17
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.

请先登录,再进行评论。


Giorgos Papakonstantinou
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];

类别

Help CenterFile Exchange 中查找有关 Resizing and Reshaping Matrices 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by