假设我有一个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+2
,B(i,k)
只为零。
答案 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))