对于不同数量位置的矩阵的每一行,在Matlab中进行左循环移位

时间:2017-07-07 10:11:36

标签: matlab

我在尺度A的Matlab中有一个矩阵mxn,由零和1组成,维度J的矩阵mx1报告来自{{1}的一些整数}。

我想构建一个维度{1,...,n}的矩阵B,以便

(1)mxn

(2)对于B(1,:)=A(1,:)i=2,...,m是通过将B(i,:)左边的多个位置等于A(i,:)

移位而得到的

此代码执行我想要的操作

(J(1)-1)+ (J(2)-1)+...+ (J(i-1)-1)

我想避免最后的循环。我喜欢Divakar的答案here,但这是一个正确的循环移位。

m=4;
n=5;
A=[1 0 1 1 0; ...
   0 1 0 0 1; ...
   1 1 0 0 0; ...
   0 0 0 0 1;
J=[2;1;5;8];
B=zeros(m,n);
B(1,:)=A(1,:);

foridx=cumsum(J); %mx1
shift=foridx-(1:1:m).'; %mx1
v=shift(1:m-1); %(m-1)x1

for i=2:m
    B(i,:)=(circshift((A(i,:)).', -v(i-1),1)).';
end

你能帮我换一个左循环班次吗?

1 个答案:

答案 0 :(得分:2)

这是一个没有循环执行此操作的小技巧。

我使用fft来移动每一行。

m=4;
n=5;
A=[1 0 1 1 0; ...
   0 1 0 0 1; ...
   1 1 0 0 0; ...
   0 0 0 0 1;]
J=[2;1;5;8];

foridx=cumsum(J); %mx1
shift=foridx-(1:1:m).'; %mx1
v=[0;shift(1:m-1)]; %(m-1)x1
L=real(round(ifft(fft(A,[],2) .* exp(2i*pi/n*v*(0:m)) ,[],2))) %left shift
R=real(round(ifft(fft(A,[],2) .* exp(-2i*pi/n*v*(0:m)) ,[],2))) %right shift