【问题标题】:Matrix row and column swapping/printing c++矩阵行和列交换/打印c ++
【发布时间】:2021-11-09 23:53:07
【问题描述】:

我正在尝试重新打印一个二维数组,array[7][3]。我试图从最初的输出中得到它

 1  2  3
 4  5  6
 7  6  8
10 11 12
13 14 15
16 17 18
19 20 21

然后首先在矩阵中输出选定的列,但按行输出,就像你选择第 2 列一样,它会输出这个

*3  6  9
12 15 18
21* 1  4 
 7 10 13
16 19  2
 5  8 11
14 17 20

我正在使用 for 循环,但我不知道如何进行交换部分。我分别将它们声明为三个不同的数组 [7]。我想我正确地将单个数组值设置为相同,但打印让我感到困惑

这是我知道无法正常工作的代码片段

//assign to single dimensional arrays

for (index = 0; index < 7; index ++)
{
pickUp[index] = trickDeck[index][columnNumber];
}

for (index = 0; index < 7; index ++)
{
pickUp2[index] = trickDeck[index][first];
}

for (index = 0; index < 7; index ++)
{
pickUp2[index] = trickDeck[index][second];
}



//reassign back to multidimensional

for (index = 0; index < 7; index ++)
{
for (column = 0; column < COLUMNS; column++)
{
trickDeck[index][column] = pickUp[row];
row++;

}
index++;
}

row = 0 ;
for (index = 0; index < 7; index ++)
{
for (column = 0; column < COLUMNS; column++)
{
trickDeck[index][column] = pickUp2[row];
row++;

}
}
row = 0;
for (index = 0; index < 7; index ++)
{
for (column = 0; column < COLUMNS; column++)
{
trickDeck[index][column] = pickUp3[row];
row++;

}

}
}

【问题讨论】:

  • 在示例中,9 来自哪里?这是一个错字,应该是 8?还是原版的 9?
  • 你说你只想以不同的顺序打印。这是否意味着实际上不需要重新排列元素,您只需要以不同的顺序打印它们?
  • 你能把你的问题说得更清楚吗?很难理解你到底想达到什么目的。

标签: c++ arrays matrix multidimensional-array


【解决方案1】:

这都是关于计算索引的。

整数和模除法将是你的朋友。让我们从计算运行索引 0,1,2,3,4 的行和列开始,.....

当然必须知道二维数组的维度。我们称他们为NumberOfRowsNumberOfColumns

然后,我们可以简单地从运行索引计算行和列:

size_t row = runningIndex / NumberOfColumns;   // This is a integer division
size_t column = runningIndex % NumberOfColumns;

好的,这很容易。现在我们反过来看。我们有一行和一列,然后想要计算一个运行索引。也很简单。见:

size_t runningIndex = row * NumberOfColumns + column;

接下来,我们要迭代特殊索引/行/列。我仔细看,我们可以看到我们要么保留行并迭代列,要么保留列并迭代行。

再一次,如果我们想像你的例子那样迭代几个以 startColumn 开头的列,我们可以使用模除法。示例:

size_t startColumn = 2;
for (size_t columnIndex = 0; columnIndex < NumberOfColumns; ++columnIndex) {
    size_t column = (columnIndex + startColumn) % NumberOfColumns;
    for (size_t row = 0; row < NumberOfRows
; ++row) 
        std::cout << array[row][column];
}

这将从起始列开始逐列打印一个数组。

有时您可能想跳过一些索引。 “跳过”被称为“步幅”,一些像 boost 这样的库甚至有一个步幅迭代器。在 C++ 中,我们可以在这种情况下使用 std::valarray。它完全满足您的需求,但对于初学者来说很难理解。

所以,根据我们上面学到的所有知识,我们可以简单地完成任务:

#include <iostream>
#include <array>

constexpr size_t NumberOfRows = 7u;
constexpr size_t NumberOfColumns = 3u;

using MyArray = std::array<std::array<int, NumberOfColumns>, NumberOfRows>;

int main() {
    // Define array with start values
    MyArray myArray{{
        {1,2,3},
        {4,5,6},
        {7,8,9},
        {10,11,12},
        {13,14,15},
        {16,17,18},
        {19,20,21}
    }};
    
    // We will store the result in this new array
    MyArray result{};
    
    // We want to read column values starting with column 2
    const size_t startColumn{2u};
    
    // This is the running index of the resulting array
    size_t runningResultIndex{};
    
    // Now iterate over all columns 
    for (size_t columnIndex{}; columnIndex < NumberOfColumns; ++columnIndex) {
        
        // Calculate effective column
        const size_t column = (columnIndex + startColumn) % NumberOfColumns;
        
        // Iterate over all rows
        for (size_t row{}; row < NumberOfRows; ++row) {
        
            // Copy values
            result[runningResultIndex/NumberOfColumns][runningResultIndex%NumberOfColumns] = myArray[row][column];
            ++runningResultIndex;
        }
    }
    // Output
    for (const auto &row : result) {
        for (const int value : row) std::cout << value << '\t';
        std::cout << '\n';
    }
    
    return 0;
}

【讨论】:

    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 2021-04-29
    • 2015-01-10
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多