c++ - 矩阵乘法问题

标签 c++ matrix multiplication

我实现了一个矩阵类。它为任意大小的矩阵动态分配内存。使用我的矩阵乘法函数时,它仅在特定条件下有效。如果您有两个 N*M 矩阵,则第一个矩阵的 M 必须等于第二个矩阵的 N。 示例:

//matrix constructor 'matrix M(n, m)
matrix A(2, 3), matrix B(3, 4);
//A and B can be multiplied because A_m == B_n
A * B; //this works!
//changing the size of n of the first matrix causes this to fail if n > m 
matrix C(4, 3), matrix D(3, 5);
C * D; // program becomes unresponsive for unknown reasons, only happens when C_n > C_m

我的矩阵类和乘法函数。

#include <iostream> 
class matrix{
    private:
        int rows, cols;
    public:
        int ** data;
        int row();
        int col();
        matrix();
        matrix(int, int);
        //~matrix();
        matrix operator*(matrix M);
        matrix operator%(matrix M);
        friend std::ostream & operator<<(std::ostream & os, matrix M);      
};

函数:

#include "matrix.h"

using std::cout;
using std::endl;

matrix::matrix(int r, int c){
    rows = r;
    cols = c;
    data = new int*[rows];
    for (int i = 0; i< rows; i++){
        data[i] = new int[cols];
    }
    for (int i = 0; i < rows; i++){
        for (int j = 0; j < cols; j++){
            data[i][j] = 0;
        }
    }
}

matrix::row(){
    return rows;
}

matrix::col(){
    return cols;
}

matrix matrix::operator*(matrix M){
    if (this->col() == M.row()){
        matrix result(this->row(), M.col());
        int var = 0;
        for (int i = 0; i < result.row(); i++){
            for (int j = 0; j < result.col(); j++){
                for (int k = 0; k < result.row(); k++){
                    var += this->data[i][k] * M.data[k][j];
                } 
            result.data[i][j] = var;
            var = 0;
            }
        }
        return result;
    }
    else cout << "FAILED";
} 

std::ostream & operator<<(std::ostream & os, matrix M){
    for (int i = 0; i < M.row(); i++){
        os << '|';
        for (int j = 0; j < M.col(); j++){
            os << M.data[i][j] << ' ';
        }
        os << "|\n";
    }
    os << '\n';
    return os;
}

为什么程序在这些情况下无法运行?

最佳答案

首先, Prop

using std::cout;
using std::endl;

很高兴看到有人没有为了像这样的简单工作而全力以赴。

现在让我们来看看这个算法。

矩阵 C(4, 3) * 矩阵 D(3, 5) 将给出矩阵结果 (4,5)

for (int i = 0; i < result.row(); i++){
    for (int j = 0; j < result.col(); j++){
        for (int k = 0; k < result.row(); k++){

决定

for (int i = 0; i < 4; i++){
    for (int j = 0; j < 5; j++){
        for (int k = 0; k < 4; k++){
            var += this->data[i][k] * M.data[k][j];
Array size:                   4  3           3  5

k 将运行 0 .. 3。k 的有效范围是 0 .. 2。

你想要的是:

for (int i = 0; i < result.row(); i++){
    for (int j = 0; j < result.col(); j++){
        for (int k = 0; k < this->cols; k++){

三个建议:

学习使用调试器。如果单步执行代码,这类问题就完全微不足道了。

然后学习使用可测试的输入进行测试,这样您就可以看到数学何时不起作用。将 0 乘以 0 绝对不会证明什么。

我建议更换

int ** data;

std::vector<std::vector<int> > data;

您可以像这样在构造函数中初始化它:

matrix::matrix(int r, int c):rows(r), cols(c), data(r, std::vector<int>(c))
{
}

无需循环遍历它以将其归零。 vector 构造函数为你做这件事。如果您不想用零加载,您可以指定另一个值。

matrix::matrix(int r, int c):
    rows(r), 
    cols(c), 
    data(r, std::vector<int>(c, <starting value goes here>))
{
}

关于c++ - 矩阵乘法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32108324/

相关文章:

c++ - system() 的奇怪行为

python - 使用python在单位矩阵中填充几个0

c - 读取复杂文件内容到二维数组(矩阵)C语言

Java: double 显示不正确

c - 将两个 long long int 相乘 C

c++ - 关于在执行不合格调用时使用名称与使用命名空间的歧义

c++ - 如何使用 C++ 将服务器的响应接收到字符串变量中?

c++ - 可以安全地从基于以下范围的 map 中删除吗?

performance - Scala快速生成上三角矩阵坐标

python - python浮点乘法中出现残差的原因