Быстрый способ умножения векторов/массивов в Matlab

Я ищу быстрый и гибкий способ вычислить следующее в Matlab без использования цикла:

c = 1:5;
A = reshape(1:5^3,5,5,5);
res= c(1)*A(:,:,1)+...+c(5)*A(:,:,5) 

Я думаю, работая с

sum(A,3) 

может быть хорошим способом, если я могу выполнить умножение по третьему измерению. Одним из решений (но с циклами) будет:

val = zeros(length(c),length(c))
for i = 1:length(c)
    val = val+c(i)*A(:,:,i)
end

Мне просто интересно, можно ли это сделать более простым (и более элегантным) способом, избегая цикла.


person muffin1974    schedule 20.04.2016    source источник
comment
Уточните немного лучше свой вопрос. вы хотите умножить что?   -  person 16per9    schedule 20.04.2016
comment
Я хочу получить разрешение в конце дня. Другими словами, я хотел бы умножить всю матрицу A (:,:, 1) на скаляр c (1), всю матрицу A (:,: ,2) со скаляром c(2) и так далее... в конце я хочу суммировать каждую из этих пяти матриц, так что res является матрицей.   -  person muffin1974    schedule 20.04.2016


Ответы (2)


Да, это идеальная работа для bsxfun и permute:

res = sum(bsxfun(@times,A,permute(c,[3,1,2])),3)

Вы отправляете c в третье измерение, используя permute(c,[3,1,2]). Затем, вызывая bsxfun, каждая из матриц в A умножается на соответствующую (переставленную) c. Наконец, вы можете сделать sum по третьему измерению.

person hbaderts    schedule 20.04.2016

Вы можете изменить форму A с 3D на 2D, используя very efficient matrix-multiplication , который даст вам массив 1D и, наконец, изменит форму обратно на 2D для окончательного вывода, например:

res = reshape(reshape(A,[],size(A,3))*c(:),size(A,1),[])
person Divakar    schedule 20.04.2016