Использование необработанных указателей для ваших массивов, как это больше в стиле C, чем в C ++.Использовать вектор вектора (индексирование все еще очень эффективно).
size_t rows(5);
size_t columns(15);
vector<float> row(columns);
vector<vector<float>> matrix(rows, row);
matrix[0][0] = 0.1f;
Еще лучше обернуть базовое хранилище в классе Matrix, который реализует необходимые матричные операции, хранит и применяет измерения, обеспечивает совместимость матриц для умноженияи т. д.
class Matrix
{
public:
Matrix(const int _rows, const int _cols) : rows(_rows), cols(_cols)
{
}
Matrix Multiply(const Matrix& rhs);
private:
vector<vector<float>> storage;
size_t rows;
size_t cols;
};
Matrix Matrix::multiply(const Matrix& rhs)
{
Matrix result(*this, rhs); // construct matrix of right dimensions
// multiply the operands
return result; // modern compilers do not copy construct the result
}
Если ваши требования к матрице сложны, вы можете рассмотреть такую библиотеку, как Boost.UBlas вместо своей собственной.Это шаблонный код и поддерживает специализации для разреженных, диагональных и других распространенных типов матриц.