这是你应该使用的答案......所以解决这个问题的一个好方法是创建一个struct
或class
包装你的数组(好吧,数据缓冲区 - 我会使用 a std::vector
)。而不是像这样的签名times(A, b, c, m, n)
,而是使用这种语法:
Matrix<4,4> M;
ColumnMatrix<4> V;
ColumnMatrix<4> C = M*V;
其中 M 的宽度/高度在<4,4>
数字中。
Matrix 类的速写可能是(有点不完整——例如,没有 const 访问)
template<size_t rows, size_t columns>
class Matrix
{
private:
std::vector<double> values;
public:
struct ColumnSlice
{
Matrix<rows,columns>* matrix;
size_t row_number;
double& operator[](size_t column) const
{
size_t index = row_number * columns + column;
Assert(matrix && index < matrix->values.size());
return matrix->values[index];
}
ColumnSlice( Matrix<rows,columns>* matrix_, size_t row_number_ ):
matrix(matrix_), row_number(row_number_)
{}
};
ColumnSlice operator[](size_t row)
{
Assert(row < rows); // note: zero based indexes
return ColumnSlice(this, row);
}
Matrix() {values.resize(rows*columns);}
template<size_t other_columns>
Matrix<rows, other_columns> operator*( Matrix<columns, other_columns> const& other ) const
{
Matrix<rows, other_columns> retval;
// TODO: matrix multiplication code goes here
return std::move(retval);
}
};
template<size_t rows>
using ColumnMatrix = Matrix< rows, 1 >;
template<size_t columns>
using RowMatrix = Matrix< 1, columns >;
以上使用了您的编译器可能没有的 C++0x 功能,并且可以在没有这些功能的情况下完成。
这一切的意义何在?您可以拥有看起来像数学并且在 C++ 中做正确事情的数学,同时非常高效,这就是“正确”的 C++ 方法。
std::vector
如果您更习惯使用C++ 的某些功能(例如处理数组内存管理),还可以使用类似 C 的方式进行编程。但这是对这个问题的不同答案。:)
(注意:上面的代码尚未编译,也不是完整的 Matrix 实现。但是,您可以在野外找到基于模板的 Matrix 实现。)