2013-07-16 22 views
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; 
} 

我上面的代码TRANSPOSE(移调)2×3的阵列...但它不编译和失败:移调数组

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)’ 

我不知道是什么问题,但。它似乎在抱怨转置()的第一个参数,但printMultiArray()似乎没有问题,以同样的方式传递数组。

其次是有更通用的方式来实现这一点? (例如通用FUNC可能采取的2x3,2x4的和2×5阵列,并返回各自的转置)

位一个基本的问题,但能够理解的任何帮助:)

+0

你有没有使用'std :: vector >或类似的东西?另外最简单的转置方法是颠倒'(i,j)':http://stackoverflow.com/questions/16737298/what-is-the-fastest-way-to-transpose-a-matrix-in-c –

+0

你真的,*真的*,***真的不想保存像这样的二阶张量。这是一个设计良好的类(可以使用'std :: vector'用于内部记忆目的)的工作。如果你还不了解课程,请阅读一本书。 – Zeta

+0

是提升uBlas一个选项?看到这个[问题](http://stackoverflow.com/questions/4097153/how-to-transpose-matrix-using-ublas)。 – dwxw

回答

3

这似乎是一个MyMatrix类的要抱怨的第一个ARG转置()

不,错误清楚地表明问题是与第一个参数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来改正错误。

+0

唉!真是愚蠢的错误,对不起:( – mbbxedh2

+0

感谢您的通用解决方案 – mbbxedh2

0

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

0

你可以使用std::vectors来实现这些,并且它会更易于阅读和管理。

但如果你想要的东西是通用的我会用Eigen。如果你坚持实现自己,你想要一些通用的东西,我会建立一个类来为你做这个。我不会去过多进入设计,但它可能是像

newMat = oldMat.Transpose() 

其中newMatoldMat是您实现