【问题标题】:c++ use 1D Array with 2D Datac++ 使用 1D 数组和 2D 数据
【发布时间】:2016-11-04 15:24:44
【问题描述】:

我不使用任何矩阵库,而是将普通的 std::vector 用于我的矩阵数据。

要使用 2D 数据填充它,我使用以下代码:

data[iy + dataPointsY * ix] = value;

我想知道这是正确的还是必须是其他方式(首先是 ix)。 据我了解,fftw 需要“行主要格式”。由于我使用它,所以公式应该根据行主格式。

【问题讨论】:

  • 关键是,您存储数据的方式应该与您检索的方式完全相同。
  • 当然,但我知道其他库依赖 row.major 格式。既然我用它,我应该按照它来排序数据。
  • 如果您尝试将二维索引编码为其他库所期望的线性格式,那么您必须完全遵循该库指定的格式。就像 MPI 函数要求矩阵的所有数据元素在内存中应该是相邻的。
  • 另外,如果您按列遍历矩阵(即单列从上到下),那么您应该考虑以列主要格式存储它,因为在这种情况下元素会相邻,允许在较小的页面错误中遍历大型数据集。
  • 问题不在于这种格式是否“正确”。问题是 fftw 库期望什么格式。

标签: c++ arrays fftw


【解决方案1】:

假设您想要fftw 的行主要格式,您想要的是:

data[ix + iy*dataPointsY]

row-major的要点是,当组合索引增加1时,对应的row索引将相同(假设没有溢出到下一行)。

double m[4][4];
mp = (double*)m;
mp[1+2*3] == m[2][1]; //true
mp[2+2*3] == m[2][2]; //true
mp[2+2*3] == m[3][1]; //false

一般来说,没有“正确”的方式来存储矩阵。行主要格式也称为“C 样式”矩阵,而列主要格式称为“fortran 样式”矩阵。命名是由于两种语言之间的多维数组索引方案不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 2021-01-28
    • 2020-07-08
    • 2017-06-18
    • 1970-01-01
    • 2014-05-26
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多