Есть ли умный способ векторизации цикла for, который присваивает элементы подматрицам матрицы?
Изначально у меня было два цикла for:
U=zeros(6*(M-2),M-2);
for k=2:M-3
i=(k-1)*6+1;
for j=2:M-3
U(i:i+5,j)=A*temp(i:i+5,j)+B*temp(i:i+5,j-1)+C*temp(i:i+5,j+1)+D*temp(i-6:i-1,j)+E*temp(i+6:i+11,j);
end
end
Затем я векторизовал внутренний циклтакой, что код теперь читается как
U=zeros(6*(M-2),M-2);
j=2:M-2;
for k=2:M-3
i=(k-1)*6+1;
U(i:i+5,j)=A*temp(i:i+5,j)+B*temp(i:i+5,j-1)+C*temp(i:i+5,j+1)+D*temp(i-6:i-1,j)+E*temp(i+6:i+11,j);
end
Это уменьшило время моего процессора более чем на 90%, поэтому я подумал, смогу ли я сделать то же самое с внешним циклом, но это кажется немного сложным,Я назначаю (6x1) -матрицы в матрице U.Я попытался
U=zeros(6*(M-2),M-2);
k=2:M-3;
i=(k-1)*6+1;
j=2:M-2;
U(i:i+5,j)=A*temp(i:i+5,j)+B*temp(i:i+5,j-1)+C*temp(i:i+5,j+1)+D*temp(i-6:i-1,j)+E*temp(i+6:i+11,j);
, но это не удалось, так как i: i + 5 вынимает только первые 6 индексов, которые я хочу.
Я также пытался использовать функцию reshape () для преобразования матрицы в вектор, но все еще кажется трудным назначать несколько блоков элементов одновременно.Всего в коде три таких цикла for, поэтому я думаю, что альтернативная оптимизация заключается в их параллельном распараллеливании.Однако без доступа к параллельному набору инструментов векторизация представляется мне хорошим решением, если это возможно.
Код является частью подпрограммы в численном методе конечных разностей для решения системы из 6 уравнений на сетке,поэтому этот вопрос может быть актуален для всех, кто работает с матричными вычислениями в системах уравнений, в частности, PDEs .Будем весьма благодарны за предложения по оптимизации кода!