Применение Boost UBLAS blas-1 к матрицам
Как применить blas уровня 1 к матрице boost::numeric::ublas? Например, я хочу вычислить максимальную запись или сумму всех записей. Использование norm_1 или norm_inf в матрице не дает ошибки компилятора, но возвращает (как мне кажется) произвольные результаты. Я использую Boost 1.42
2 ответа
Решение
norm_inf
на матрице вычисляет матричную норму, индуцированную бесконечностью в базовом векторном пространстве. Это максимальная сумма строки в матрице.
Если вы посмотрите на пример Ханнеса, последняя строка матрицы (i=99, j=0...99) содержит:
9900, 9901, 9902, ... , 9999
Если вы суммируете эти записи, вы получите 994950
что именно norm_inf
производит.
Минимальный пример выглядит так:
#include<iostream>
#include<boost/numeric/ublas/matrix.hpp>
using namespace boost::numeric::ublas;
int main(){
int l = 100;
matrix<double> m(l,l);
for (int i = 0; i < l; ++i) {
for (int j = 0; j < l; ++j) {
m(i,j)=i*l+j;
}
}
std::cout << norm_inf(m)<<std::endl;
return 0;
}
Это должно дать 99, но дает 994950.
Это однострочник, который хотя бы решает данную задачу:
float infnorm = accumulate(m.data().begin(),m.data().end(),0,std::max<double>);