我想为动态二维数组创建一个转置函数。我希望函数将2d数组和行和列作为参数。我决定使用双指针。但是我对如何从main调用函数感到有点困惑。所以我有上面的代码
#include<iostream>
using namespace std;
void transposeMatrix(double **mat, int rows, int columns)
{
mat = new double*[rows];
for (int i = 0; i < rows; ++i)
{
mat[i] = new double[columns];
}
double temp;
for (int i = 0; i<rows; i++)
{
for (int j = i+1; j<columns; j++)
{
temp=mat[i][j];
mat[i][j]=mat[j][i];
mat[j][i]=temp;
}
}
cout<< "\n";
for (int i = 0; i<rows; i++)
{
for (int j = 0; j<columns; j++)
{
cout << mat[i][j] << " \t";
}
cout << "\n";
}
}
int main()
{
int rows = 10;
int columns = 10;
double mat[rows][columns];
for (int i = 0; i<rows; i++)
{
for (int j = 0; j<columns; j++)
{
mat[i][j] = j;
}
}
for (int i = 0; i<rows; i++)
{
for (int j = 0; j<columns; j++)
{
cout << mat[i][j] << " \t";
}
cout << "\n";
}
//mat = new double[50][1];
transposeMatrix(mat, 10, 10);
system("pause");
return 0;
}
有什么想法吗?
答案 0 :(得分:5)
您的代码存在几个主要问题。
最大的一点是double[10][10]
not convertible指向double**
指针。
您的mat
实施中也存在内存泄漏(transposeMatrix()
)。
我建议您将打印矩阵和转置矩阵的问题分开。也许是(模板化)矩阵类的单独方法。
现在,说了那个......
为什么在a perfectly good implementation already exists时写一个?
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
int main ()
{
using namespace boost::numeric::ublas;
matrix<double> m(3, 3);
for (unsigned i = 0; i < m.size1(); ++i)
{
for (unsigned j = 0; j < m.size2(); ++j)
{
m(i, j) = 3 * i + j;
}
}
std::cout << m << std::endl;
std::cout << trans(m) << std::endl;
}
[3,3]((0,1,2),(3,4,5),(6,7,8))
[3,3]((0,3,6),(1,4,7),(2,5,8))
答案 1 :(得分:5)
你非常接近。您正确调用该函数,函数的参数列表是正确的。首先,从转置函数中删除此部分:
mat = new double*[rows];
for (int i = 0; i < rows; ++i)
mat[i] = new double[columns];
}
现在确保所有括号都匹配。 (有一个失踪。)
您不能使用非常量变量作为大小参数来定义静态数组(如下所示:x[y][z]
)。 (即y
和z
必须是常量。)但实际上,无论如何,您都将动态数组传递给转置函数,rows
和columns
没有要成为常数。因此,在main中,定义一个像这样的动态数组:
double** mat = new double*[rows];
for (int i = 0; i < rows; i++)
mat[i] = new double[columns];
之后,您的代码应该可以运行。但您也可以通过将矩阵显示代码放在函数中来使其更好。然后,不是在任何地方切割和粘贴它,你所要做的就是调用函数!这是一个很重要的习惯。玩得开心!
答案 2 :(得分:2)
double ** transpose(double **matrix, int rows, int columns){
double ** trans;
trans=new double *[columns];
for(int i=0;i<columns;i++){
trans[i]=new double[rows];
for(int j=0;j<rows;j++)
trans[i][j]=matrix[j][i];
}
return trans;
for(int i=0;i<columns;i++)
delete[] trans[i];
delete[] trans;
}
这是矩阵转置的代码。