Резкий контраст обусловлен не только удивительной оптимизацией Matlab (как уже говорилось во многих других ответах), но и тем, как вы формулировали матрицу как объект.
Кажется, вы сделали матрицу списком списков?Список списков содержит указатели на списки, которые затем содержат ваши матричные элементы.Местоположения содержащихся списков назначаются произвольно.Поскольку вы перебираете свой первый индекс (номер строки?), Время доступа к памяти очень значительно.Для сравнения, почему бы вам не попробовать реализовать матрицу в виде одного списка / вектора, используя следующий метод?
#include <vector>
struct matrix {
matrix(int x, int y) : n_row(x), n_col(y), M(x * y) {}
int n_row;
int n_col;
std::vector<double> M;
double &operator()(int i, int j);
};
И
double &matrix::operator()(int i, int j) {
return M[n_col * i + j];
}
Тот же алгоритм умножения должен использоваться так, чтобыколичество флопов одинаково.(n ^ 3 для квадратных матриц размера n)
Я прошу вас рассчитать время так, чтобы результат был сопоставим с тем, что вы имели ранее (на той же машине).Сравнение покажет, насколько значительным может быть время доступа к памяти!