0
#include<iostream>
using namespace std;


void transpose(const int input[2][3], int (&output)[3][2]){
    for(int i=0; i<2; ++i) {
        for(int j=0; j<3 ; ++j) {
            output [j][i] = input [i][j];
        }
    }
}

void printMultiArray(const int multi[2][3], const int len){
    for (int row=0; row<2; row++){
        for (int col=0; col<3; col++){
            cout << multi[row][col] << " " ;
        }                               
        cout << endl;                           
    }                                               
}   


int main(){

    int multi[2][3] = {{1, 2, 3}, {7, 8, 9}};
    int empty[3][2];


    printMultiArray(multi, 6);
    cout << "... space line ..." << endl;

    transpose(multi, empty);
    printMultiArray(empty, 6);


    return 0;
}

我有上面的代码来转置一个 2x3 数组......但它没有编译并且失败:

6-3-transposeArray.cpp: In function ‘int main()’:
6-3-transposeArray.cpp:33: error: cannot convert ‘int (*)[2]’ to ‘const int (*)[3]’ for argument ‘1’ to ‘void printMultiArray(const int (*)[3], int)’

我不确定问题是什么。似乎在抱怨 transpose() 的第一个参数,但 printMultiArray() 似乎对以相同方式传递的数组没有问题。

其次,是否有更通用的方法来实现这一点?(例如,一个可以接收 2x3、2x4 和 2x5 数组并返回每个数组的转置的通用函数)

一个基本的问题,但任何帮助表示赞赏:)

4

3 回答 3

3

似乎在抱怨 transpose() 的第一个参数

不,错误清楚地表明问题出在printMultiArray. 您正在传递一个 3x2 数组,并且该函数是针对 2x3 数组进行硬编码的。

其次,是否有更通用的方法来实现这一点?

是的; 您可以使用整数模板参数来指定尺寸:

template <size_t N, size_t M>
void transpose(const int (&input)[N][M], int (&output)[M][N]) {
    for (size_t i = 0; i < N; ++i) {
        for (size_t j = 0; j < M; ++j) {
            output[j][i] = input[i][j];
        }
    }
}

可以从函数参数中推断出正确的模板特化:

transpose(multi, empty); // Automatically selects N=2, M=3.

同样,您可以实现一个泛型printMultiArray来修复您的错误。

于 2013-07-16T16:14:29.520 回答
0

创建一个包含向量的类。在构造函数中传递矩阵的 x 和 y 大小,并将向量的大小调整为 x * y。创建获取/设置函数(或运算符 []),它采用用户希望访问的 x、y 坐标。类中还有一个“转置”布尔标志。如果标志为真,交换 x 和 y,然后返回 vec[x + y * sizex]。现在转置数组不需要任何复制。只需翻转旗帜。

于 2013-07-16T16:13:00.943 回答
0

您可以使用来实现这些std::vectors,它会更具可读性和可管理性。

但是,如果您想要通用的东西,我会使用Eigen。如果您坚持自己实现并且想要通用的东西,我会构建一个为您执行此操作的类。我不会过多介绍设计,但可能是这样的

newMat = oldMat.Transpose()

您实现的类的位置newMat和位置oldMatMyMatrix

于 2013-07-16T16:14:05.463 回答