Попробуйте это в MATLAB:
z = sum(X.*(A*X));
Это дает результаты, эквивалентные предложению Федерико с использованием функции DOT , но должно выполняться немного быстрее. Это потому, что функция DOT внутренне вычисляет результат так же, как я делал выше, используя функцию SUM . Тем не менее, DOT также имеет дополнительные проверки входных аргументов и дополнительные вычисления для случаев, когда вы имеете дело с комплексными числами, что является дополнительными издержками, которые вы, вероятно, не хотите или не нуждаетесь.
Примечание по вычислительной эффективности:
Несмотря на то, что разница во времени между тем, как быстро выполняются два метода, небольшая, если вы собираетесь выполнить операцию много раз, она начнет складываться. Чтобы проверить относительные скорости, я создал две матрицы случайных значений размером 100 на 100 и рассчитал время для двух методов на несколько прогонов, чтобы получить среднее время выполнения:
METHOD AVERAGE EXECUTION TIME
--------------------------------------------
Z = sum(X.*Y); 0.0002595 sec
Z = dot(X,Y); 0.0003627 sec
Использование SUM вместо DOT , следовательно, сокращает время выполнения этой операции примерно на 28% для матриц с примерно 10 000 элементов. Чем больше матрицы, тем более незначительной будет разница между этими двумя методами.
Подводя итог, если это вычисление представляет собой существенное узкое место в том, как быстро работает ваш код, я бы выбрал решение, использующее SUM . В противном случае, любое решение должно быть в порядке.