Я обнаружил, что boost::ublas не поддерживает поэлементные операции и операции в последовательности. очень хорошо (но эффективность довольно высока :)) Я пытаюсь
D = A^2 .* B^3 .* C
где A, B, C — все квадратные матрицы одинакового размера, оператор «.*» обозначает поэлементное операция, а ^ — степень матрицы. С помощью boost:ublas я написал
for (int n=0; n<300; n++)
{
for (int k=0; k<300; k++)
{
D(n, k) = pow(abs(A(n, k)), 2)*pow(abs(B(n, k)), 3)*C(n, k);
}
}
В моей программе есть много последовательных операций, подобных показанным выше, в любом случае я могу получить тот же результат, но используя одну строку кода вместо цикла?
Кроме того, я заметил, что недопустимо присваивать константу всем элементам матрицы или вектора, например
boost::numeric::ublas::vector v(100); v = 0,2;
Вместо этого я должен использовать цикл, чтобы снова выполнить присваивание. Есть ли лучший способ сохранить код? Мой алгоритм действительно длинный, и в нем так много утомительных операций, подобных указанным выше. Я попробовал другую числовую библиотеку Armadillo, которая обеспечивает хороший способ упрощения операций, но в настоящее время не предполагает разреженных матриц (которые тратят около 10 раз на выполнение моего кода).