Изменяя X
до вектора размером [1 x 1 x 20]
и используя неявное расширение , создается массив 3D [M+1 x M+1 x 20]
, затем путем суммирования по третьему измерению можно получить результат.
X = rand(1,20);
M = 30;
ii = 0:M;
jj = (0:M).';
Y = reshape(X,1,1,[]);
result = sum(Y.^(ii+jj), 3);
Однако, поскольку выражение Y.^(ii+jj)
создает массив 3D [M+1 x M+1 x 20]
, ему может потребоваться большой объем памяти, что приводит к снижению производительности.
Мы знаем, что x^(i+j)
можно записать какx^i * x^j
Таким образом, выражение может быть записано как:
result = sum(Y.^ii .* Y.^jj,3);
Оно имеет то же потребление памяти, что и предыдущий метод.Но когда мы достигаем выражения, которое содержит сумму произведений, мы должны подумать о том, чтобы преобразовать его в очень быстрое умножение матриц :
Z = X .^ jj; % A [M+1 x 20] matrix is created(implicit expansion)
result = Z * Z.' % multiply Z by its transpose
Таким образом, тот же самый результат получается без усложнения другогорешения.