【问题标题】:why array is smaller than matrix smaller than vector ? c++ [closed]为什么数组小于矩阵小于向量? c++ [关闭]
【发布时间】:2021-10-25 18:34:51
【问题描述】:

我正在尝试读取 mnist 文件并将元素放入矩阵向量中。 code to read mnist

for(int r = 0; r < n_rows; ++r)
{
    for(int c = 0; c < n_cols; ++c)
    {
        unsigned char temp = 0;
        file.read((char*)&temp, sizeof(temp));
        data[r][c] = temp;
        //std::cout << "r: " << r << " c: " << c << " temp: "<< sizeof(temp) << "\n";
    }
} //this print my array the correct way

for(int k = 0; k < 28; k++)
{
    for(int z = 0; z < 28; z++)
    {
        std::cout << data[k][z] << " ";
        if(z == 27)
            std::cout << "\n";
    }
}

cv::Mat img(28,28,CV_8U,&data);
mnist.push_back(img);
std::cout<<"data: "<< sizeof(data) << " img: "<< sizeof(img) << " mnist: " << sizeof(mnist) <<"\n";

上面最后一行的输出是:

data(array): 784 img(cv::Mat): 96 mnist(vector of matrix): 24

它们不应该至少相同大小吗? 这就是为什么我认为当我打印我的矩阵时没有显示正确的输出(与数组相同) 我猜这个向量引用了矩阵,而矩阵引用了数组,但是内存中的某处发生了变化,这就是为什么输出不是我所期望的?

[编辑]

上面的代码在一个返回矩阵向量的函数中。

当我在主函数中使用代码时,输​​出正常!

有人能解释一下吗?

我宁愿把它放在一个单独的函数中,而不是有一个巨大的主......但我会继续使用现在工作的东西。

【问题讨论】:

  • 什么是data? sizeof(object) 不是 object.size()。
  • 请注意,在向量上使用sizeof 将始终为您提供相同的大小,无论向量中有多少项目。这是因为向量对象只包含管家信息,而实际数据存储在动态分配的内存中。
  • 数据持有 28 * 28 uchar

标签: c++ opencv vector mnist digital-handwritting


【解决方案1】:

基本上你误解了sizeof 的作用。它返回对象类型的大小,但不返回对象拥有或引用的所有内存的大小。具体来说,无论指针指向多少内存,指针的大小通常为 8 个字节,例如

int main()
{
    int* foo;
    std::cout << "foo is " << sizeof(foo) << " bytes.\n";

    foo = new int[10000];
    std::cout << "foo is still " << sizeof(foo) << " bytes.\n";

}

您的问题的其余答案来自上述内容。例如,std::vector 通常是 sizeof 24 字节,因为它通常使用三个指针来实现。

【讨论】:

  • 这是我对线程的问题的正确答案。尽管我在几次 cmets 后进行了编辑...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 2014-03-19
  • 2014-09-23
相关资源
最近更新 更多