【问题标题】:two dimensional array with undefined second dimension具有未定义第二维的二维数组
【发布时间】:2017-10-13 03:46:31
【问题描述】:

我有一个不知道如何解决的问题。我有一个 C++ 函数,它打开一个 .wav 文件,将样本读入一个双精度数组,该数组的索引与 .wav 文件中的样本数一样多,然后返回一个指向该数组的指针。这完美地工作。

我想要做的是读取多个 .wav 文件并将它们存储在一个二维数组中。虽然我知道会有多少个数组,但每个数组的大小会有所不同,因为所有 .wav 文件都有不同的样本数。我不知道如何为多个文件正确存储这些数据。

这是对 wav2sig 的调用,该函数打开 .wav 并返回一个指针:

double* wav2sig(std::string filepath, int & num_samples)

这是我正在处理的代码,大致。

std::string paths[3] = {"man1.wav",
                          "man2.wav",
                          "man3.wav"};

double **data = new double[3][];   //this would work in java, but not here

int num_samples[3];

for(int i = 0; i < 3; i++) {
     data[i] = wav2sig(paths[i], num_samples[i]);
     for(int j = 50; j < 100; j++)
          std::cout << data[i][j] << " ";
     std::cout << std::endl;
}

我知道返回的指针包含所有正确的数据。我只是不知道如何正确存储其中的几个。感谢您的帮助!

【问题讨论】:

  • 奇怪的是,我在发布后立即尝试了这个,它似乎奏效了。将double **data = new double[3][]; 更改为double **data = new double*[3]; 我想我没有在创建时将指针设置为数组?

标签: c++ arrays pointers audio multidimensional-array


【解决方案1】:

我强烈建议对数组使用std::vector,而不是指向动态分配内存的指针。它们同样易于使用,并且消除了管理内存的麻烦。

改变wav2sig的返回值

std::vector<double> wav2sig(std::string filepath);

我猜num_samples 用于返回返回数组中的元素数。当您使用std::vector&lt;double&gt; 作为返回类型时,返回值的大小将捕获它。因此,不需要额外的输出参数。

std::vector&lt;std::vector&lt;double&gt;&gt; 用于二维数组。

std::vector<std::vector<double>> data;

相应地更新循环

// Separate reading of the data from files from outputting the data

// Read the data
for(int i = 0; i < 3; i++) {
   data.push_back(wav2sig(paths[i]);
}

// Output the data
for(int i = 0; i < 3; i++) {
   for(size_t j = 0; j < data[i].size(); j++)
      std::cout << data[i][j] << " ";
   std::cout << std::endl;
}

【讨论】:

  • 我想过这样做。我担心使用带有这么多 push_back 调用的向量对性能的影响。例如,我正在处理的几个文件只有 10 秒长,但有大约 180,000 个样本。这是 180k 的回调调用,我认为这会对性能产生严重影响。除此之外,您的实施将非常有效。
  • 除非向量中有数百万个元素,否则您可能不会注意到任何性能问题。
  • 好的。因此,如果我有一个由 10 个向量组成的向量,每个向量包含 200,000 个元素,那我的元素数量将达到 2,000,000 个。我想我可以看到一些性能问题。希望不会变成这样。我可以把这两个版本都放在代码里然后选择。
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多