创建一批随机矩阵

create a batch of random matrices

本文关键字:随机 一批 创建      更新时间:2023-10-16

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

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

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

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;
}