2017-06-14 135 views
-1

我想使用清除函數與隨機生成的值做一個矩陣乘法。因此,我希望使用函數(mat_def)來生成矩陣,而另一個函數(mat_mul)在矩陣作爲參數發送時將它們相乘。矩陣 - 返回並傳遞參數C++

#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

using namespace std; 

double mat_def(int n) //how to return the matrix 
{ 
    double a[n][n]; 

    double f; 

    for(int i=0; i<n; i++) 
    { 
     for(int j=0; j<n; j++) 
     { 
      f= rand(); 
      cout<<f ; 
      a[i][j]=f; 
     } 

    } 

    return 0; 
} 


double mat_mul(int n, double a[n][n], double b[n][n]) //how to send matrix as parameter 
{ 
    return 0; 
} 


int main() 
{ 
    /* initialize random seed: */ 
    srand (time(NULL)); 
    mat_def(10); 
} 
+0

你的問題是什麼?你想知道如何增加兩個矩陣或其他東西? –

+0

在C++中實現Matrix類有很多種方法。通常,查找重載':: operator []'並返回一個內部類的引用,該類也重載':: operator []',這樣你就可以擁有真正的Matrix語法。 – jiveturkey

+1

問題:在編譯時已知矩陣的大小嗎? 矩陣是否僅僅是方矩陣? –

回答

2

這是一個很好的標準C++矩陣模板。

Matrix.h

#include <vector> 

class Matrix 
{ 
    class InnerM 
    { 
     private: 
      int ydim; 
      double* values; 

     public: 
      InnerM(int y) : ydim(y) 
      { 
       values = new double[y]; 
      } 

      double& operator[](int y) 
      { 
       return values[y]; 
      } 
    }; 

    private: 
     int xdim; 
     int ydim; 

     std::vector<InnerM> inner; 

    public: 

     Matrix(int x, int y) : xdim(x), ydim(y), inner(xdim, InnerM(ydim)) 
     { 
     } 

     InnerM& operator[](int x) 
     { 
      return inner[x]; 
     } 
}; 

所有的內存泄漏在那裏爲你,但你的想法。從這裏你可以在矩陣類中通過過濾::operator*()來處理乘法。

+1

班是正確的路,但有一些改進的餘地。 'InnerM'需要析構函數。現在它泄漏。一旦解決了問題,您可能會注意到它不符合[三項規則](https://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree),並且可能導致喜劇之後的錯誤。到目前爲止,這兩個問題的最佳解決方案是另一個「std :: vector」。最後一項改進是性能調整問題。通過使用包含動態分配的「vector」,您將失去存儲的連續性,並輕鬆緩存友好性。 – user4581301

+0

絕對如我所說,我只是吐出一些東西。 – jiveturkey

1

我假設你的問題是定義二維數組,然後將它傳遞給mat_mul函數來乘以矩陣。其餘的將會非常簡單。

定義2-d陣列(考慮存儲器的需要在運行時知道):

int rows,cols; 
    cin >> rows; 
    cin >> cols; 

    int **arr = new int*[rows];   // rows X cols 2D-array 
    for(int i = 0; i < rows; ++i) { 
     arr[i] = new int[cols]; 
    } 

可以定義另一個2-d陣列完全相同的方式與所需的行和列。

現在,跑過2-d陣列起作用:

void mat_mul(int **arr1, int **arr2, int m, int n, int p, int q){ 
    //define a 2-D array to store the result 
    //do the multiplication operation 
    //you could store the result in one of the two arrays 
    //so that you don't have to return it 
    //or else the return type should be modified to return the 2-D array 
} 

例如:

void display(int **arr, int row, int col){ 
    for (int i=0; i<row; i++){ 
     for(int j=0;j<col; j++){ 
      cout << arr[i][j] << '\t'; 
     } 
     cout << endl; 
    } 
} 

刪除存儲如果不是用下面的語法不再需要:

for(int i=0; i<rows; i++){ 
    delete[] array[i]; 
} 
delete[] array; 

希望這將足以完成您的工作!

關於如何返回SO上的二維數組已經有了答案。檢查下面的鏈接。

https://stackoverflow.com/a/8618617/8038009

+0

不要對矩陣使用數組。它很慢,很煩人,並且會丟棄程序員的所有內存管理。至少在課堂上包裝它。 – user4581301

2

返回原始分配是一個吸盤的賭注。您需要管理自己分配的所有內存,並使用矩陣大小參數傳遞它。

爲什麼要受苦?採用了矩陣類

template<class Type> 
class Matrix{ 
    int rows; 
    int cols; 
    std::vector<type> data; 
public: 
    Matrix(int row, int col):rows(row), cols(col), data(rows*cols) 
    { 
     // does nothing. All of the heavy lifting was in the initializer 
    } 
    // std::vector eliminates the need for destructor, assignment operators, and copy 
    //and move constructors. 
    //add a convenience method for easy access to the vector 
    type & operator()(size_t row, size_t col) 
    { 
     return data[row*cols+col]; 
    } 
    type operator()(size_t row, size_t col) const 
    { 
     return data[row*cols+col]; 
    } 
}; 

用法是

Matrix<double> mat_mul(const Matrix<double> &a, const Matrix<double> &b) 
{ 
    Matrix<double> result; 
    // do multiplication 

    return result; 
} 

int main() 
{ 
    /* initialize random seed: */ 
    srand (time(NULL)); 
    Matrix<double> matA(10, 10); 
    matA(0,0) = 3.14; // sample assignment 
    matA(9,9) = 2.78; 
    double x = matA(0,0) * matA(9,9) 
    Matrix<double> matB(10, 10); 

    Matrix<double> matC = mat_mul(matA, matB) ; 
} 

更多的功能,如從initializer list建設,可被添加到類,讓您的生活更輕鬆。如果您選擇,您還可以指定operator *過載Matrix並使用該過載代替mat_mul。閱讀Operator overloading以瞭解更多信息。