3

"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,:)」はN行ではなくNxNxM行列を返すため、解決策が見つかりませんでした。

助言がありますか?

4

2 に答える 2

1

sub2ind次元 1、2 で使用します。bsxfun次元 3 に沿って複製します。そしてprod

c = prod(r(bsxfun(@plus, sub2ind([N N], tab, 1:N).', (0:M-1)*N^2))).';
于 2014-01-15T11:43:51.643 に答える
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));
于 2014-01-15T11:30:05.423 に答える