它没有显示要相乘的矩阵,也没有相乘。(C ++,DYNAMIC MATRIX)

时间:2018-09-28 11:25:12

标签: c++ matrix dynamic matrix-multiplication

我想乘以2个矩阵,再乘以标量和矩阵。 不过,在此之前,我想显示矩阵先相乘然后相乘,但这不能正常工作。我不知道是什么问题。 这是代码。提前致谢。 这里是不同的构造函数,析构函数,运算符和函数。

Matriu::Matriu(){
    m_fila = 0;
    m_columna = 0;
    m_valor = 0;
    matriu = new float*[m_fila];
    for(int i = 0; i < m_fila; i++){
       matriu[i] = new float[m_columna];
    }
}

Matriu::Matriu(int nFiles, int nColumnes){      
    m_fila = nFiles;
    m_columna = nColumnes;
    matriu = new float*[m_fila];
    for(int i = 0; i < m_fila; i++){
        matriu[i] = new float[m_columna];
    }       
}

Matriu::Matriu(const Matriu& m){
    m_fila = m.m_fila;
    m_columna = m.m_fila;
    matriu = new float*[m_fila];
    for(int i = 0; i < m_fila; i++){
        matriu[i] = new float[m_columna];
    }
    for(int i = 0; i < m_fila;i++){
        for(int j = 0; j < m_columna; j++){
            matriu[i][j] = m.matriu[i][j];
        }
    }
}

Matriu::~Matriu(){
    for(int i = 0; i < m_fila; i++){
        delete[] matriu[i];
    }
    delete[] matriu;
}

void Matriu::setValor(float valor){
    for(int i = 0; i < m_fila; i++){
        for(int j = 0; j < m_columna; j++){
            matriu[i][j] = valor;
        }
    }
}

Matriu& Matriu::operator=(const Matriu& m){
    for(int i = 0; i < m_columna; i++){
        delete[] matriu[i];
    }
    delete[] matriu;
    m_fila = m.m_fila;
    m_columna = m.m_columna;
    matriu = new float*[m_fila];
    for(int i = 0; i < m_fila; i++){
        matriu[i] = new float[m_columna];
    }
    for(int i = 0; i < m_fila; i++){
        for(int j = 0; j < m_columna;j++){
            matriu[i][j] = m.matriu[i][j];
        }
    }
    return *this;
}

void Matriu::init(int nFiles, int nColumnes){
    if(!esBuida()){
        for(int i = 0; i < m_columna; i++){
            delete[] matriu[i];
        }
    }
    delete[] matriu;

    m_fila = nFiles;
    m_columna = nColumnes;
    matriu = new float*[m_fila];
    for(int i = 0; i < m_fila; i++){
        matriu[i] = new float[m_columna];
    }
}

Matriu Matriu::operator*(const Matriu& m){
    if(m_columna != m.m_fila){
        for(int i = 0; i < m_fila; i++){
            for(int j = 0; j < m_columna; j++){
                matriu[i][j] = 0;
            }
        }
    } 
    Matriu aux(m);
    for (int i=0; i< m.m_fila; i++) 
        for (int j=0; j< m.m_columna; j++)
        {
            aux.matriu[i][j] = 0;

            for(int x = 0; x < m.m_fila; x++){
                aux.matriu[i][j] = aux.matriu[i][j] + matriu[i][x]*matriu[x][j];
            }           
        }
    return aux;     
}

Matriu Matriu::operator*(float s){      
    for(int i = 0; i < m_fila; i++){
        for(int j = 0; j < m_columna; j++){
            matriu[i][j] = s * matriu[i][j];
        }
    }
    return *this;
}

bool Matriu::esBuida() const{
    if(matriu == NULL){
        return true;
    }else{
        return false;
    }
}

float& Matriu::operator()(int fila, int columna){       
    assert(fila >= 0 && fila < m_fila);
    assert(columna >= 0 && columna < m_columna);
            return matriu[fila][columna];       
}

float& Matriu::operator()(int fila,int columna)const{
    if(fila >= 0 && fila < m_fila){
        if(columna >= 0 && columna < m_columna){
            return matriu[fila][columna];
        }
    }       
}

这是我的课程。

class Matriu
{
public:
    Matriu();
    Matriu(int nFiles, int nColumnes);
    Matriu(const Matriu& m);
    ~Matriu();

    Matriu& operator=(const Matriu& m);
    void init(int nFiles, int nColumnes);
    void setValor(float valor);
    void setNFiles(int fila){m_fila = fila;}
    void setNColumnes(int columna){m_columna = columna;}
    Matriu operator*(const Matriu& m);
    Matriu operator*(float s);
    float getValor(){return m_valor;}
    bool esBuida() const;
    int getNFiles() const{return m_fila;}
    int getNColumnes() const{return m_columna;}
    float& operator()(int fila, int columna);
    float& operator()(int fila,int columna)const;
private:
    float** matriu;


    int m_fila;
    int m_columna;
    int m_valor;
};

为了显示乘法之前的矩阵,我主要有2个函数(这是正确的,我知道这不是问题)。 预先感谢。

2 个答案:

答案 0 :(得分:1)

此代码中有几个问题。

  1. Matriu::operator*(float s)更改矩阵本身,而不是返回更改后的副本。 A * 5应该修改A(但目前已修改)。

  2. Matriu::operator*(const Matriu& m)中检测到矩阵大小不匹配时,请将当前矩阵设置为零。那不是正确的错误处理-您仍然可以访问数组。引发异常或返回空矩阵。不要只是抹去当前矩阵。

  3. 矩阵乘法中返回的矩阵Matriu aux(m);的大小错误。您使用右侧矩阵的大小,这是不正确的。

然后,评论中提到了许多其他有关设计的问题。

答案 1 :(得分:0)

这里有错误

Matriu::Matriu(const Matriu& m){
    m_fila = m.m_fila;
    m_columna = m.m_fila;

应该是

Matriu::Matriu(const Matriu& m){
    m_fila = m.m_fila;
    m_columna = m.m_columna;

那肯定会停止矩阵乘法工作