Ну, я решил это сам через некоторое время.
Это мое решение: (начальные переменные)
n=50; kn=-n:n; Qq=kn;
Vql=rand(2*n+1); Pkl=rand(2*n+1); Fs=rand(2*n+1,1);
Теперь я создаю пару фиктивных переменных:
pk=repmat(kn,(2*n+1),(2*n+1)^2);
pk=pk(:);
vk=repmat(kn,(2*n+1)^2,(2*n+1));
vk=vk(:);
fk=repmat(kn,(2*n+1)^3,1);
fk=fk(:);
Perms=[fk vk pk]; % Possible combinations of all 3 indices of the sum
Inds=find(sum(Perms,2)==0); % valid combinations that satisfy s+k+q==0
Теперь я преобразовываю свои матрицы Vql, Pkl, Fs и Qq, чтобы они соответствовали тому же макету, что и мои фиктивные переменные:
Vk_ord=flipud(Vql);
repmat(Vk_ord,(2*n+1),(2*n+1));
Vk_ord=Vk_ord(:);
Q_ord=repmat(Qq,(2*n+1)^2,2*n+1);
Q_ord=Q_ord(:);
Pk_ord=repmat(Pkl(:),(2*n+1)^2,1);
F_ord=repmat(Fs,(2*n+1)^3,1);
F_ord=Fkreord(:);
Наконец, я объединяю все свои переставленные векторы ивозьмите только те, которые имеют правильную комбинацию индексов, вычислите продукты и затем полученное суммирование:
preSum=[F_ord(Inds) Vk_ord(Inds) Q_ord(Inds) Pk_ord(Inds)];
preSum=prod(preSum,2);
Summation=sum(preSumation);