Я хотел бы сделать функцию для обобщения умножения матрицы. В принципе, он должен иметь возможность выполнять стандартное умножение матрицы, но он должен позволять изменять два бинарных оператора product/sum любой другой функцией.
Цель должна быть максимально эффективной, как с точки зрения процессора, так и с точки зрения памяти. Конечно, он всегда будет менее эффективным, чем A * B, но гибкость операторов здесь.
Вот несколько команд, которые я мог придумать после прочтения различных интересных темы:
A = randi(10, 2, 3);
B = randi(10, 3, 4);
% 1st method
C = sum(bsxfun(@mtimes, permute(A,[1 3 2]),permute(B,[3 2 1])), 3)
% Alternative: C = bsxfun(@(a,b) mtimes(a',b), A', permute(B, [1 3 2]))
% 2nd method
C = sum(bsxfun(@(a,b) a*b, permute(A,[1 3 2]),permute(B,[3 2 1])), 3)
% 3rd method (Octave-only)
C = sum(permute(A, [1 3 2]) .* permute(B, [3 2 1]), 3)
% 4th method (Octave-only): multiply nxm A with nx1xd B to create a nxmxd array
C = bsxfun(@(a, b) sum(times(a,b)), A', permute(B, [1 3 2]));
C = C2 = squeeze(C(1,:,:)); % sum and turn into mxd
Проблема с методами 1-3 состоит в том, что они будут генерировать n матриц, прежде чем сворачивать их с помощью sum(). 4 лучше, потому что он выполняет сумму() внутри bsxfun, но bsxfun все еще генерирует n матриц (за исключением того, что они в основном пусты, содержащие только вектор значений non-zeros, являющихся суммами, остальное заполняется 0, чтобы соответствовать требования к размерам).
Что бы я хотел, это что-то вроде 4-го метода, но без бесполезной памяти 0.
Любая идея?