来自主要
的电话matrix_multiplication(arrayA,arrayB,row1,col1,col2);
功能定义
float matrix__multiplication(float **arrayA,float **arrayB,int row1,int col1,int col2)
{
float result[row1][col2];
result[][]=....
return result;
}
我想知道如何在函数调用中传递2d数组, 如何在函数定义中接收 以及如何返回结果矩阵?
答案 0 :(得分:1)
使用像这样的数组的原始指针比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这样的库而不是自己的库。这是模板化代码,支持稀疏,对角线和其他常见类型矩阵的特化。
答案 1 :(得分:0)
通过传递对任何类型的2D数组(实际上是D1 X D2)数组的引用,我会这样。这也可以避免任何返回任何东西的需要。
如果函数需要修改输入数组参数,则删除const。
void f( T const (&r)[D1][D2] ){}
int main() {
float fbuf[10][3];
f(fbuf);
}
如果你坚持让函数返回一个二维数组,你可以这样做:
template<class T, size_t D1, size_t D2>
T (&f( T const (&r)[D1][D2] ))[D1][D2]{
T temp[D1][D2];
return temp;
}
int main() {
float fbuf[10][3];
f(fbuf);
}
答案 2 :(得分:0)
您所写的不是有效的c ++代码。为了将result
初始化为适当的大小,row
和col
需要编译它们不是的时间常量。您可以从本地分配的函数返回float**
,或者(更好)将预先分配的float** result
作为另一个参数传递给您的函数(您仍然可以返回)。但是,通常不会使用二维数组来存储矩阵,而是为一维数组中的矩阵定义线性存储并定义适当的访问器。
float** matrix__multiplication(float **arrayA,float **arrayB,float **result, int row1,int col1,int col2)
{
// ...
return result;
}
// caller needs to allocate (and de-allocate) space (see the mess?):
result = new float* [row1];
std::for_each(result, result + row1, [col2] (float*& pCurr) -> void {
pCurr = new float[col2];
});
result = matrix_multiplication(a, b, result, row1, col1, col2);