Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Еще раз матрицы

41K
12 октября 2010 года
gaga
44 / / 22.07.2009
Навеяло этой темой.
А кто знает какие-нибудь хорошие матричные библиотеки? Хорошие, это значит, что ими удобно пользоваться, т.е. можно писать нормальные выражения вроде
Matrix A = B.inverse() * C + D и которые выполняются БЫСТРО, т.е. сделаны без виртуальных функций, исключений и прочего в критичных местах?
Я помню потратил два дня на поиски, нашел пару десятков, из которых меня устроила только одна: Eigen. Собственно, хочу и поделиться этой ссылкой на замечательную библиотеку. Остальные либо платные, либо медленные, либо с убогим интерфейсом и возможностями. Может, кто знает еще для сравнения?
41K
12 октября 2010 года
gaga
44 / / 22.07.2009
ну и скелет решения задачки mego4el:
Код:
#include <iostream>
#include "Eigen/Core"
#include "Eigen/Array" // Matrix.setRandom()

USING_PART_OF_NAMESPACE_EIGEN
using namespace std;

static const int MATR_SIZE = 5;

int main(int argc, const char *argv[])
{
    // Создаем матрицу и заполняем случайными числами
  MatrixXf m(MATR_SIZE, MATR_SIZE);
  m.setRandom(MATR_SIZE, MATR_SIZE);
  cout << "input matrix: " << endl << m << endl;

  double product = 1; // произведение элементов на главной диагонали
  int i;
  for (i = 0; i < MATR_SIZE; i++) {
      product *= abs(m(i, i));
  }
  product = pow( product, 1.0/i ); // среднее геометрическое

  cout << "Geometric mean on main diag: " << product << endl;

  // заменяем эл-ты с четной суммой коэфф-в на среднее геометрическое
  for (int i = 0; i < MATR_SIZE; i++) {
      for (int j = 0; j < MATR_SIZE; j++) {
          if ( !((i + j) & 1) ) {
              m(i,j) = product;
          }
      }
  }

  cout << "output matrix: " << endl << m << endl;
  return 0;
}
842
13 октября 2010 года
sigmov
301 / / 16.09.2008
Цитата: gaga
А кто знает какие-нибудь хорошие матричные библиотеки? Хорошие, это значит, что ими удобно пользоваться, т.е. можно писать нормальные выражения вроде
Matrix A = B.inverse() * C + D


В GNU есть. Хотя бы в той же Octave.

Цитата: gaga
и которые выполняются БЫСТРО, т.е. сделаны без виртуальных функций, исключений и прочего в критичных местах?


Не вижу связи между БЫСТРО и без исключений.
Неужели B.inverse() не выкинет исключения для неквадратной B? - это же полный бред получиться....

Так что throw обязательно должны быть. Другое дело, что не должно быть отбработки исключений - блоков catch.

41K
13 октября 2010 года
gaga
44 / / 22.07.2009
Цитата: sigmov
В GNU есть. Хотя бы в той же Octave.

Не вижу связи между БЫСТРО и без исключений.
Неужели B.inverse() не выкинет исключения для неквадратной B? - это же полный бред получиться....

Так что throw обязательно должны быть. Другое дело, что не должно быть отбработки исключений - блоков catch.



Спасибо, гляну на Octave.
Связь есть, если много вычислений с небольшими матрицами, то очень существенная. Не выкинет, конкретно в этом случае вернет нулевую матрицу, если не ошибаюсь.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог