3

Предположим, что «r» - это многомерный массив размера [N, N, M], а «tab» - таблица размера [N] со значениями 1..N (например, принять "вкладка = randperm (N)"). Я ищу эффективный способ сделать следующее:matlab: адресация нескольких строк в многомерном массиве

c = ones(M, 1); 
    for k=1:N 
     c = c .* squeeze(r(tab(k),k,:)); 
    end 

Я хотел бы сделать это в матричной форме, используя тычок, но не нашел решение, как «г (табл (1: N), 1: N, :) "возвращает матрицу NxNxM, а не N строк.

Любые предложения?

+0

Что такое 'tab'? – Daniel

+0

@DanielR: Из текста вопроса: "и tab - таблица размера [N] со значениями 1..N" –

+0

@RobertP. верно; например возьмите «tab = randperm (N)» –

ответ

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)); 
1

Использовать sub2ind поперечные размеры 1, 2; bsxfun для тиражирования по размеру 3; и затем prod:

c = prod(r(bsxfun(@plus, sub2ind([N N], tab, 1:N).', (0:M-1)*N^2))).'; 
+0

Я не совсем понимаю синтаксис: есть ли «.» Действительный синтаксис? –

+1

http://www.mathworks.de/de/help/matlab/ref/transpose.html – Daniel

+0

Вы можете удалить этот окончательный '.'', если вы не против получения вектора строки вместо вектора линии –

Смежные вопросы