将矩阵转移到数组中

时间:2019-07-05 13:21:05

标签: c++

我正在解决一个问题,该问题要求我使用单下标数组来操作双下标数组。因此,问题是:如何将双下标数组转换为单下标数组?还是无法转换。如何通过单下标数组操作双下标? 例如:

int matrix[ m ][ n ];
   //How can you transform matrix into array? Or operate it?
int array[ m * n ];

基本上,问题是这样问的:“创建一个类DoubleSubscriptedArray。在构造时,该类应该能够创建任意数量的行和任意数量的列的数组。double的基础表示形式-下标数组应该是具有rows * columns个元素数的整数的单下标数组。

3 个答案:

答案 0 :(得分:3)

最简单的答案:

int array[m * n];

for (int y = 0; y < n; ++y) {
  for (int x = 0; x < m; ++x) {
    array[y * m + x] = matrix[x][y];
  }
}

位置:

  • y-行号
  • x-列号

现在您需要将所有行序列化为一个:

row_no/col_no | 0 | 1 | 2 |
______________|___|___|___|
      0       | 1 | 2 | 3 |   <-- matrix data
      1       | 4 | 5 | 6 |

         ||
        \  /
         \/
array_no   0  1  2  3  4  5
           |  |  |  |  |  |
         [ 1, 2, 3, 4, 5, 6 ]  <-- array data

array_no = row_no * number_of_rows + col_no

您可以 TEST :)

P.S您也可以这样:

int* array = (int*)matrix;

它是没有复制的版本:)

答案 1 :(得分:3)

您的矩阵连续存储为m乘n个元素。您可以做的是将矩阵的第一个元素解释为int *,然后有了数组。这样可以防止复制元素。

int main()
{
    int matrix[3][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} };
    int* array = &matrix[0][0];

    // int array[9] = {1, 0, 0, 0, 1, 0, 0, 0, 1}

    return 0;
}

如果您需要复制元素,可以尝试

#include <memory>

int main()
{
    int matrix[3][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} };
    int array[9];

    std::memcpy(&array[0], &matrix[0][0], sizeof(array));

    // int array[9] = {1, 0, 0, 0, 1, 0, 0, 0, 1}

    return 0;
}

答案 2 :(得分:0)

您可以重新计算一维数组的索引以存储二维数组的核心对应值。

如果您需要复制,高效的方法是将原始行从两个暗淡数组复制到一个暗淡,这是因为多维数组以原始市长顺序存储, 索引可以计算为

oneDimIndex =行* n + col

您要在matrix [row,col]处获取元素的地方

然后,您可以通过相同的计算从一维数组中检索内容。