Булево условие в vecorized операции Matlab - PullRequest
0 голосов
/ 01 марта 2019

У меня есть следующее суммирование enter image description here

где: s, k, q, l - целые числа {-n ..., - 2, -1,0,1, 2, ..., п}.«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 голосов
/ 02 марта 2019

Ну, я решил это сам через некоторое время.

Это мое решение: (начальные переменные)

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);
...