假设“r”是一个大小为[N,N,M]的多维数组,“tab”是一个大小为[N]的表,值为1..N(例如取“tab = randperm(N)” )。我正在寻找有效的方法来做到以下几点:
c = ones(M, 1);
for k=1:N
c = c .* squeeze(r(tab(k),k,:));
end
我想用矩阵表示法,使用prod,但没有找到解决方案,因为“r(tab(1:N),1:N,:)”返回NxNxM矩阵而不是N行。
有什么建议吗?
答案 0 :(得分:1)
跨尺寸1,2使用sub2ind
; {3}}沿着维度3复制;然后是bsxfun
:
c = prod(r(bsxfun(@plus, sub2ind([N N], tab, 1:N).', (0:M-1)*N^2))).';
答案 1 :(得分:0)
%% example data
M=3;
N=4;
r=rand(N,N,M);
tab=randperm(N);
%% original code
c = ones(M, 1);
for k=1:N
c = c .* squeeze(r(tab(k),k,:));
end
%% Code is equivalent to:
% rh=r(tab,:,:);
% c2 = ones(M, 1);
% for k=1:N
% c2 = c2 .* squeeze(rh(k,k,:));
% end
% assert(all(c2==c));
%% second solution: Use sub2ind to index
rh=r(tab,:,:);
ix=sub2ind(size(rh),ceil(1/M:1/M:N),ceil(1/M:1/M:N),repmat(1:M,1,N));
rh2=rh(ix);
rh3=reshape(rh2,M,N);
c3=prod(rh3,2);
assert(all(c3==c));