vecorized操作Matlab中的布尔条件

时间:2019-03-01 04:26:23

标签: matlab vectorization boolean-expression

我有以下总结enter image description here

其中: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);  

然后将所有元素求和以获得最终结果。

1 个答案:

答案 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);