Это некрасиво, но, насколько я вижу, это работает. Я не уверен, что это будет быстрее, чем ваш цикл, хотя, кроме того, он имеет большие накладные расходы памяти. Во всяком случае, здесь идет:
A_3D = repmat(reshape(A, size(A, 1), 1, size(A, 2)), 1, size(B, 2));
B_3D = repmat(B, [ 1 1 size(A, 2)]);
result_3D = sum(A_3D .* B_3D, 1);
result = reshape(result_3D, size(A, 2), size(B, 2))
Что он делает: превращает A в трехмерную матрицу размером n x 1 x m, поэтому по одному столбцу в каждом индексе 3-го измерения. Затем мы повторяем матрицу, чтобы получить матрицу n x d x m. Мы повторяем B также в 3-м измерении. Затем мы делаем кусочное умножение всех элементов и суммируем их. Результирующая матрица представляет собой матрицу 1 x d x m. Мы преобразуем это в матрицу m x d.
Я почти уверен, что несколько раз менял размеры в своем объяснении, но я надеюсь, что вы получите общий смысл.
Умножение с диагональной матрицей кажется, по крайней мере, в два раза быстрее, но я не смог найти способ использовать diag, так как для него нужна векторная или 2D матрица в качестве входных данных. Я мог бы попытаться позже позже вечером, я чувствую, что должен быть более быстрый путь:).
[Edit] Разделите команду по частям, чтобы хотя бы сделать ее немного читабельной.