Matlab矩阵索引变换

时间:2014-04-23 16:20:19

标签: performance matlab matrix indexing vectorization

假设我有一个Matlab矩阵A(x,y),它是一个大小为N + 1的方阵。

我想要一个新的矩阵B,其元素B(x,z)A(x,N-x-z),如果x + z> N,B(x,z)只是零。

当然我可以使用2级for循环来做,但为了性能,我想知道是否有'矢量化'方法来完成这项工作。

修改1

上述所有指数均从0开始。

编辑2

如果指数从1而不是0开始,问题可以重新表述如下:

我有一个Matlab矩阵A(i,j),它是一个大小为N + 1的方阵。

我想要一个新的矩阵B,其元素B(i,k)A(i,N+3-i-k),如果i+k>N+2B(i,k)只为零。

1 个答案:

答案 0 :(得分:1)

希望这就是你要找的 -

N = size(A,1)

B = A

B(fliplr(triu(ones(N)))~=1)=NaN
B = fliplr(B)

[~,col1] = sort(~isnan(B),2,'descend')
row1 = repmat(1:N,N,1)'; %%//'
restructured_indices = sub2ind(size(B),row1(:),col1(:))
B = reshape(B(restructured_indices),N,N)
B(isnan(B))=0

版本2:

N = size(A,1)

col1 = bsxfun(@minus,repmat(N:-1:1,N,1),[0:N-1]');%%//'
row1 = repmat([1:N]',1,N) %%//'

valid_ind = find(col1>0);
col1 = col1(valid_ind);
row1 = row1(valid_ind);

ind2 = sub2ind(size(A),row1(:),col1(:))

B= zeros(size(A));
B(valid_ind)= A(ind2)

版本2(更短的表格):

B = zeros(size(A));
N = size(A,1)

col1 = bsxfun(@minus,repmat(N:-1:1,N,1),[0:N-1]') %%//'
remapped_ind = bsxfun(@plus,N.*(col1-1),[1:N]') %%//'

normal_ind = 1:N*N;
B(normal_ind(remapped_ind>0)) = A(remapped_ind(remapped_ind>0))