创建一批随机矩阵

时间:2016-01-09 13:48:33

标签: c++ arrays database list pointers

我想创建一批随机大小(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));

    }
}

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

BTW我知道代码中存在问题..它正在调试中。

1 个答案:

答案 0 :(得分:2)

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<std::vector<unsignd char>>

的解决方案
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;
}