2013-07-16 20 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是您實現