【问题标题】:create a batch of random matrices创建一批随机矩阵
【发布时间】:2016-04-14 03:37:02
【问题描述】:

我想创建一批随机大小 (10-1000) 的矩阵和随机数据。我需要以某种方式安排这批,以便我可以在以后的数据处理中使用它,所以它们需要一个一个地访问。

#include <stdio.h>
#include <assert.h>
#include <list>;



unsigned char* createAMatrix(int width,int hight){
    unsigned char mat[width][hight];
    unsigned char* ptr;
    srand(100);
    for(int row=0;row<hight;row++){
        for(int col=0;col<width;col++){
            mat[row][col]=rand();
        }
    }
    ptr=&mat[0][0];
    return ptr;
}

int main(int argc, char **argv)
{
    std::list<unsigned char*> matList;

    //create a batch of matrixes
    int batchSize=1;
    srand(100);
    for(int k=0;k<batchSize;k++){
        //set 10-1000 hight & width
        int matWidth=rand()%990+10;
        int matHight=rand()%990+10;
        //create matrix
        matList.push_back(createAMatrix(matWidth,matHight));

    }
}

这是我到目前为止所拥有的,我无法确定解决此问题的最佳方法是指针还是其他方法?使用列表是存储它们的最佳方式吗?

顺便说一句,我知道代码中存在问题。它正在调试中。

【问题讨论】:

    标签: c++ arrays database list pointers


    【解决方案1】:

    unsigned char mat[width][hight]; 是一个局部变量,当函数createAMatrix 返回时超出范围。您必须分配动态内存。像这样调整你的代码:

    unsigned char* createAMatrix(int width,int hight){
        unsigned char* ptr = new unsigned char[width*hight];
        srand(100);
        for(int row=0;row<hight;row++){
            for(int col=0;col<width;col++){
                ptr [row*hight+col]=rand();
            }
        }
        return ptr;
    }
    

    注意,您必须在程序结束时delete 分配的内存。

    int main(int argc, char **argv)
    {
        std::list<unsigned char*> matList;
    
        //create a batch of matrixes
        int batchSize=1;
        srand(100);
        for(int k=0;k<batchSize;k++){
            //set 10-1000 hight & width
            int matWidth=rand()%990+10;
            int matHight=rand()%990+10;
            //create matrix
            matList.push_back(createAMatrix(matWidth,matHight));
    
        }
    
        for ( std::list<unsigned char*>::iterator it = matList.begin(); it != matList.end(); it++ )
            delete *it; 
    }
    

    我建议使用std::vector 而不是动态内存分配。这是std::vector&lt;std::vector&lt;unsignd char&gt;&gt;的解决方案

    void createAMatrix(int width,int hight, std::vector<std::vector<unsignd char>> &mat ){
        srand(100);
        mat.reserve( hight );
        for(int row=0;row<hight;row++){
            mat.push_back( std::vector(width) );
            for(int col=0;col<width;col++){
                mat.back().push_back( rand() );
            }
        }
        return ptr;
    }
    

    【讨论】:

    • 我考虑过使用向量,但我无法决定。选择了一个数组,没有理由超过一个向量..你能帮我证明一个向量在数组上的使用是合理的吗?