【问题标题】:Matrix class C++矩阵类 C++
【发布时间】:2015-12-24 11:12:40
【问题描述】:

嘿,我是计算机科学专业的学生, 我们被要求使用向量类构建一个通用矩阵,我们根本不允许使用“new”和“delete”。 我不知道如何正确启动它我们可以使用这些库:

卡带

矢量

cstdlib

cmath

我在网上找遍了,但没有找到一个使用向量作为矩阵的类(矩阵的索引是mat[i*cols+j])并且不使用new和delete函数或分配内存:

我们应该检查的示例:(int google test)

“矩阵.hpp”

template < class T ><class T> class Matrix {
    private:
        int rows;
        int cols;
        vector< T > mat;

    public:
        Matrix(int row, int col,const T& mat2):rows(row),cols(col) {
            mat.resize(rows*cols);
            //?
        };

        Matrix(int row, int col);
        virtual ~Matrix();
        Matrix(const Matrix< T >& rhs);
        Matrix< T > transpose();
        Matrix< T >& operator=(const Matrix< T >& rhs);
        bool operator==(const Matrix< T >& rhs)const;
        const int getRowNum() const;
        const int getColNum() const;
        Matrix< T >& operator+(const Matrix< T >& rhs);
};

"gtest/gtest.h"

Matrix<int> mat1(1, 1, std::vector<int>(1,2));

EXPECT_EQ(1, mat1.getRowNum());
EXPECT_EQ(1, mat1.getColNum());

int t= 0;
EXPECT_TRUE(mat1.hasTrace(t));
EXPECT_TRUE(mat1.isSquareMatrix());

Matrix<int> transpose_mat= mat1;
EXPECT_EQ(transpose_mat, mat1.transpose());

Matrix<int> mat2(1, 1, std::vector<int>(1,3));
Matrix<int> add_mat(1, 1, std::vector<int> (1,5));
EXPECT_EQ(add_mat, mat1+mat2);

Matrix<int> multi_mat(1, 1, std::vector<int>(1,6));
EXPECT_EQ(multi_mat, mat1*mat2);

Matrix<int> scalar_multi_mat(1, 1, std::vector<int>(1,4));
EXPECT_EQ(scalar_multi_mat, mat1*2);

这是我们应该做的:

Matrix 接口:必须定义并实现泛型类文件Matrix.hpp Matrix。矩阵将是通用的,四肢不一定是整数,而是通用类型数字。出于尽职调查的目的,你们松鼠有权假设运营商将进行上述必要的锻炼。您也可以假设松鼠用于相对于矩阵的其余部分,使得连接或两次的原子步骤的顺序)长链计算(没关系。例如(a + b)+ c = = a + (b + c) 给出了可以使用默认语言的练习或函数),当然都是通用的(:

  • 没有参数的构造函数。构建器构建一个 1x1 矩阵,其中器官执行 T,其中 T 是存储在矩阵中的类型。
  • 构造函数获取行数、列数和用矩阵填充的值的向量)看到驱动调用这个构造函数没有实现,部门结构应该让default足够好李>
  • (Constructor Copy)复制构造函数(不同的矩阵接收器)没有实现,该部门应该结构化,以便默认足够好
  • (赋值操作符)没意识到,必须建立部门,以便默认足够好
  • 连接矩阵的加号 (+) 运算符。
  • 乘法 (*) 运算符矩阵乘法。它做函数的对象的矩阵是左矩阵乘法。
  • (交换函数矩阵)转置
  • (Aqaba 函数) HasTrace(引用器官接受者泛型类型和任务其中的trace 值(如果有)的矩阵并返回一个布尔值:如果是方阵则为true,而另一种为false 的情况则放价值附加身份机构收到关于.reference的信息
  • 上面的四个函数)connection、transpose和HasTrace double(不是从它被应用的对象函数。另外,你可以根据你认为对部门有用的,添加更多的public函数或者Privacy期望。李>

如果有人可以帮助我,我将不胜感激!

【问题讨论】:

  • 鉴于大多数矩阵不会调整大小,动态分配似乎很愚蠢。
  • 我们使用 std::vector 或 std::list 仅此而已,贴在我到目前为止所做的下面,但我不知道如何继续,例如我们需要使用副本构造函数是默认的,这是什么意思?
  • @CoffeeandCode,并非所有矩阵都是 3D 图形中使用的固定 3x3 或 4x4 矩阵。矩阵用于视频游戏以外的许多学科。你怎么知道矩阵维度和数据不是从磁盘加载的?

标签: c++11 matrix


【解决方案1】:

您可以首先考虑NxM 矩阵可以表示为具有M*N 元素的向量。加减法等运算变得简单地等同于向量加减法。

更一般的操作,不过需要一个简单的转换来将矩阵索引[a, b] 转换为向量索引[c]

给定矩阵索引[a, b],您可以使用以下方法找到对应的向量元素:

c = a*N + b

类似地,将向量索引[c] 转换为矩阵索引[a, b]

a = c / N
b = c % N

这里的/% 是整数除法和模数。

【讨论】:

    【解决方案2】:
    template < class T ><class T> class Matrix {
    
     private:
    
     int rows;
     int cols;
     vector< T > mat;
    
     public:
    
    
     Matrix(int row, int col,const T& mat2):rows(row),cols(col) {
       mat.resize(rows*cols);
       //?
     };
    
     Matrix(int row, int col);
     virtual ~Matrix();
     Matrix(const Matrix< T >& rhs);
     Matrix< T > transpose();
     Matrix< T >& operator=(const Matrix< T >& rhs);
     bool operator==(const Matrix< T >& rhs)const;
     const int getRowNum() const;
     const int getColNum() const;
     Matrix< T >& operator+(const Matrix< T >& rhs);
    };
    

    【讨论】:

    • 请不要发布补充您问题的代码作为答案
    • 发布自己问题的答案并没有错。
    • @graham.reeds... 我认为重点是,这属于问题;它是“Matrix.hpp”头文件的内容。我将根据这个假设采取行动并将其复制到上面的问题中。
    猜你喜欢
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多