用c ++创建矩阵

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c ++创建矩阵相关的知识,希望对你有一定的参考价值。

我对C ++编程比较陌生,我想通过编程矩阵来学习更多有关语言的知识。我有这个代码可以工作,但我无法弄清楚如何创建适用于任何数量的列和行的代码。我无法将矩阵传递给函数,函数具有由用户输入确定的行和列。

这就是我所拥有的:

#include <iostream>

using namespace std;

template <int rows, int cols>
void display(int (&array)[rows][cols]) {
  int i, j;
  cout<<"
";
  for(i = 0; i<rows; i++) {
      for(j = 0; j<cols; j++) {
        cout<<" ";
        cout<<array[i][j];
      }
      cout<<"
";
    }
}


int main() {
  int M1[3][3];
  cout<<"Enter your matrix elements: 
";
  int i, j;
    for(i = 0; i<3; i++) {
      for(j = 0; j<3; j++) {
        cout<<"a["<<i<<"]["<<j<<"]: ";
        cin>>M1[i][j];
      }
    }
    display(M1);
  return 0;
}

是否可以在不使代码复杂化的情况下执行此类任务?

答案

许多评论和评论都可以,但我认为最好的策略是使用单个矢量存储和形状矢量。学习蟒蛇numpy以理解概念或搜索ndarray,这是多少个不同的平台命名这个概念(n维数组)。然后,可以将捆绑数据向量,形状向量和方便的运算符和成员函数的类捆绑起来。

另一答案

经典答案需要您为阵列执行动态内存分配。如果你是新手,这有点压倒性。 (据我所知,这仍然是在C中完成的方法)

但是,在现代C ++中做类似事情的推荐方法是使用标准模板库。

/*
... Stuff where you get input from the user, specifically the num of rows and cols
... Say these vals were stored in 2 ints num_rows and num_cols
*/
std::vector<std::vector<int> > mat(num_rows);
for (int i = 0; i < num_rows; i++) {
    mat[i].resize(num_cols); // this will allow you to now just use [][] to access stuff
}

请参阅下面的第一条评论,它有一个很好的方法来避免循环设置向量并在初始化时处理它

另一答案

您应该使用STL,但如果您更喜欢自己管理内存,那么这样的事情对您有用:

#include <iostream>
using namespace std;

template<typename T>
class Matrix
{
public:
    Matrix(unsigned nrows, unsigned ncols) 
        : m_nrows(nrows), m_ncols(ncols)
    {
        m_data = new T[m_nrows*m_ncols]();
    }
    ~Matrix()
    {
        delete[] m_data;
    }
    void setElement(unsigned row, unsigned col, const T elem)
    {
        m_data[(row - 1) * m_ncols + (col - 1)] = elem;
    }
    template<typename T>
    friend ostream& operator<<(ostream& os, const Matrix<T>& mat);
private:
    T* m_data;
    unsigned m_nrows;
    unsigned m_ncols;
};

template<typename T>
ostream& operator<<(ostream& os, const Matrix<T>& mat)
{
    for (unsigned i = 0; i < mat.m_nrows; i++)
    {
        for (unsigned j = 0; j < mat.m_ncols; j++)
        {
            cout << mat.m_data[i*mat.m_ncols + j] << " ";
        }
        cout << endl;
    }
    return os;
}

int main(int argc, char** argv) {
    if (argc < 3)
    {
        cout << "Usage: <program name> <num rows> <num cols>" << endl;
    }

    int nrows = atoi(argv[1]), ncols = atoi(argv[2]);
    Matrix<int> intMatrix(nrows, ncols);
    cout << intMatrix;

    // your code goes here
    return 0;
}

以上是关于用c ++创建矩阵的主要内容,如果未能解决你的问题,请参考以下文章

求算法,用邻接矩阵和邻接表创建一个图,实现深度和广度搜索,菜单形式,c语言的代码。无向无权的图。

用c语言编程 1创建图的邻接矩阵和邻接表 2验证图的深度优先、广度优先遍历算法 3验证最短路径

如何创建一个.so 文件,其中仅包含用 C 代码包装的 C++ 代码 - OpenCV 相关?

用c语言写二叉树,源代码。

Python Cookbook(第3版)中文版:15.10 用Cython包装C代码

Python Cookbook(第3版)中文版:15.9 用WSIG包装C代码