РЕДАКТИРОВАТЬ:
Несмотря на то, что проблема в вопросе была обновлена, алгебраический подход все еще может быть использован для упрощения вопросов.Вам все еще не нужно возиться с трехмерными матрицами.Ваш результат будет следующим:
output = mean(v.^2).*A.^2 + 2.*mean(v.*w).*A.*B + mean(w.^2).*B.^2;
Если ваши матрицы и векторы большие, это решение даст вам гораздо лучшую производительность из-за уменьшения объема памяти, необходимого по сравнению с решениями, использующими BSXFUN или REPMAT .
Объяснение:
Предполагается, что M
является m-by-n-by-d Матрица, которую вы получаете в результате, прежде чем взять среднее значение по третьему измерению, это то, что будет содержать промежуток по третьему измерению:
M(i,j,:) = A(i,j).*v + B(i,j).*w;
Другими словами, вектор v
масштабируется по A(i,j)
плюс вектор w
, масштабированный до B(i,j)
.И это то, что вы получаете, когда применяете поэлементное возведение в квадрат:
M(i,j,:).^2 = (A(i,j).*v + B(i,j).*w).^2;
= (A(i,j).*v).^2 + ...
2.*A(i,j).*B(i,j).*v.*w + ...
(B(i,j).*w).^2;
Теперь, когда вы берете среднее значение по третьему измерению, результат для каждого элемента output(i,j)
будет следующим:
output(i,j) = mean(M(i,j,:).^2);
= mean((A(i,j).*v).^2 + ...
2.*A(i,j).*B(i,j).*v.*w + ...
(B(i,j).*w).^2);
= sum((A(i,j).*v).^2 + ...
2.*A(i,j).*B(i,j).*v.*w + ...
(B(i,j).*w).^2)/d;
= sum((A(i,j).*v).^2)/d + ...
sum(2.*A(i,j).*B(i,j).*v.*w)/d + ...
sum((B(i,j).*w).^2)/d;
= A(i,j).^2.*mean(v.^2) + ...
2.*A(i,j).*B(i,j).*mean(v.*w) + ...
B(i,j).^2.*mean(w.^2);