4

A является 3D-N * N * L матрица, x является N * 1 вектор, на котором мне нужно сделать следующую операцию:Как сделать быстрое многомерное матричное векторное умножение?

for i=1:L 
    res(i)=x'*squeeze(A(:,:,i))*x 
end 

Я надеюсь использовать наиболее эффективный векторизованную метод вместо for петля. Пожалуйста, дайте мне несколько советов?

+0

Я предлагаю быть более конкретным: вам не требуется умножение матричных векторов, но вычисляется квадратичная форма. Но возможно, что для меня это только имеет значение :) –

+0

Я не могу попробовать это прямо сейчас, но вы можете быть чем-то вроде 'sum (sum (bsxfun (@ times, permute (bsxfun (@ times, permute (A , [3 1 2]), reshape (x, [1 1 N])), [1 3 2]), reshape (x, [1 1 N])), 2), 2) ' –

+0

@ J.Andrew Я вернул свой вопрос в прежнее состояние. Это связано с тем, что вы обновили свой вопрос, сделав оба ответа, в том числе тот, который вы приняли как «полезный» устаревший. Если у вас есть новый вопрос, пожалуйста, откройте новый вопрос, а не расширьте его. – Adriaan

ответ

5

С bsxfun -

sum(reshape(bsxfun(@times,x,bsxfun(@times,A,x.')),[],L),1) 

С matrix-multiplication-fun -

reshape(x*x.',1,[])*reshape(A,[],L) 
+4

Что касается второго: «Вы волшебник?»;) –

+3

Вам кажется, что «забавный» парень будет рядом. – Adriaan

+0

@Adriaan Я обвиняю * забавные инструменты * висит вокруг :) – Divakar

2
N=10;L=5; 
A = rand(N,N,L);x=rand(N,1); 
C = sum(sum(bsxfun(@times,permute(bsxfun(@times,permute(A,[3 1 2]),reshape(x,[1 1 N])),[1 3 2]),reshape(x,[1 1 N])),2),2); 
C = squeeze(C(:,1,:)); 

Благодаря @AndrasDeak, хотя вы сделали пропустить последний squeeze вызов.

+1

Я очень удивлен, что это работает :) К сожалению (и, как ожидалось), ответ Дивакара гораздо более изящный. –

+0

Это именно то, чего мы ожидали, конечно. Я попытался использовать 'permute (x, [4 3 1 2])', который начался правильно, но закончился в 4D-матрице, я не был уверен, как вернуть обратно в форму – Adriaan

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