относительно поэлементных операций в boost::ublas

Я обнаружил, что 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 раз на выполнение моего кода).

5
задан user1285419 20 May 2012 в 20:15
поделиться