其中:s,k,q,l是整数{-n ...,-2,-1,0,1,2,...,n}。 'P'和'V'存储为(2n + 1)*(2n + 1)矩阵,'q'和'f'是(2n + 1)* 1数组。我如何对这项操作进行监督?对于| n | <= 10的循环,可能的情况是可以的,但我的目标是在| n |> 100中这样做,因为这会花费太多时间。
到目前为止,我的想法是找到有效组合(s,k,q)的所有对应索引,然后一次操作所有产品
preSum=q(valid_permutation).*f(valid_permutation).*P(valid_permutation).*V(valid_permutation);
然后将所有元素求和以获得最终结果。
答案 0 :(得分:0)
好吧,过一会儿我自己解决了。
这是我的解决方案: (初始变量)
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);