【问题标题】:Tranfsorm an 8x4 Matrix into a 40x20 composed of 5x5 patterns将 8x4 矩阵转换为由 5x5 模式组成的 40x20
【发布时间】:2021-06-08 17:30:43
【问题描述】:

我必须将一个 8 x 4 的二维字符数组转换为一个 40 x 20 的 {0,1} 二维数组,原始数组的每个单元格都是从 A 到 F 的一个字母,代表一个 cetain {0,1) 在 5x5 中的组合,这有点难以描述,所以我将向您展示我的意思:

  F  D  A  E
  E  F  F  C
  A  A  C  C
  C  C  E  B
  B  B  B  A
  A  C  F  A
  A  C  C  B
  A  A  E  E

each letter represents a 5x5 array of given combination that looks for example like this(This is the "F" variant)

0 0 1 0 0
0 0 1 0 0
1 1 1 1 1
0 0 1 0 0
0 0 1 0 0

转换后,40 x 20 数组将是 int 类型,并且仅包含 {0,1} 到目前为止,这是我的代码:

void MacierzSegmentow(char MacierzPosegmentowana[Wymiar8][Wymiar4])
{
    for (int i = 0; i < 8; i++)
        for (int j = 0; j < 4; j++)
            MacierzPosegmentowana[i][j] = char(rand() % 6 + 65);
}

任何帮助将不胜感激,我不知道该怎么做。

【问题讨论】:

  • 您对图书馆开放吗? Eigen 可以轻松做到这一点。
  • @AndrewHolmgren 这是练习嵌套循环的简单作业。不确定,Eigen 是否适合这个。 (听起来有点过度设计。)而且,我严重怀疑 OP 是否能够处理它。
  • 我什至不能在这个项目中使用 STL 库,这是一个学校的库。获取 40x20 矩阵后,我必须创建一个动态创建的邻接列表,如果顶点都是“1”等,则顶点是相邻的。这只是我在这个项目中遇到的第一个障碍,因为我对编程还很陌生。
  • 如何存储与字符'A''F' 对应的5x5 矩阵?
  • @KrzysiekDymanowski 好的,很高兴知道约束和上下文。重新发明轮子没有意义(Eigen 是我不重新发明轮子的首选矩阵库),但在这种情况下,您似乎被要求这样做是为了学习。这仍然是非常开放的,你需要一个“2D”矩阵,还是你可以只引用块?

标签: c++ arrays matrix


【解决方案1】:

假设字符数据如下:

#define CHAR_DATA_WIDTH  5
#define CHAR_DATA_HEIGHT 5
#define CHAR_DATA_SIZE   6
int character_data[CHAR_DATA_SIZE][CHAR_DATA_HEIGHT][CHAR_DATA_WIDTH] = {
    {...}, // data for 'A'
    {...}, // data for 'B'
    {...}, // data for 'C'
    {...}, // data for 'D'
    {...}, // data for 'E'
    {...}, // data for 'F'
};

那么,如果你的输入和输出是这样的:

#define INPUT_DATA_WIDTH  4
#define INPUT_DATA_HEIGHT 8
char input_data[INPUT_DATA_HEIGHT][INPUT_DATA_WIDTH] = {
  {'F',  'D',  'A',  'E'},
  {'E',  'F',  'F',  'C'},
  {'A',  'A',  'C',  'C'},
  {'C',  'C',  'E',  'B'},
  {'B',  'B',  'B',  'A'},
  {'A',  'C',  'F',  'A'},
  {'A',  'C',  'C',  'B'},
  {'A',  'A',  'E',  'E'},
};

#define OUTPUT_DATA_WIDTH  INPUT_DATA_WIDTH*CHAR_DATA_WIDTH
#define OUTPUT_DATA_HEIGHT INPUT_DATA_HEIGHT*CHAR_DATA_HEIGHT
int output_data[OUTPUT_DATA_HEIGHT][OUTPUT_DATA_WIDTH] = {};

然后您可以使用它来一次转换输入中的每个字符:

void ConvertInputToOutput()
{
    for(int y=0;y<INPUT_DATA_HEIGHT;y++)
        for(int x=0;x<INPUT_DATA_WIDTH;x++)
            CopyCharacterToOutput(x*CHAR_DATA_WIDTH,y*CHAR_DATA_HEIGHT,input_data[y][x]);
}

CopyCharacterToOutput 的前两个参数是输出数据中应该放置字符数据的位置。第三个参数是要在该位置放入输出的字符。

您可以使用它来将适当的字符数据复制到输出:

void CopyCharacterToOutput(int start_x, int start_y, char character)
{
    for(int y=0;y<CHAR_DATA_HEIGHT;y++)
        for(int x=0;x<CHAR_DATA_WIDTH;x++)
            output_data[y+start_y][x+start_x] = character_data[character-'A'][y][x];
}

output_data需要偏移起始位置,传入的字符需要从字符转换为数组索引。

综上所述,我们得到了这个:

#include <stdio.h>

#define CHAR_DATA_WIDTH  5
#define CHAR_DATA_HEIGHT 5
#define CHAR_DATA_SIZE   6
int character_data[CHAR_DATA_SIZE][CHAR_DATA_HEIGHT][CHAR_DATA_WIDTH] = {
    // A
    {
        {0,1,1,1,0},
        {1,0,0,0,1},
        {1,1,1,1,1},
        {1,0,0,0,1},
        {1,0,0,0,1},
    },
    // B
    {
        {1,1,1,1,0},
        {1,0,0,0,1},
        {1,1,1,1,0},
        {1,0,0,0,1},
        {1,1,1,1,0},
    },
    // C
    {
        {0,1,1,1,1},
        {1,0,0,0,0},
        {1,0,0,0,0},
        {1,0,0,0,0},
        {0,1,1,1,1},
    },
    // D
    {
        {1,1,1,1,0},
        {1,0,0,0,1},
        {1,0,0,0,1},
        {1,0,0,0,1},
        {1,1,1,1,0},
    },
    // E
    {
        {1,1,1,1,1},
        {1,0,0,0,0},
        {1,1,1,1,0},
        {1,0,0,0,0},
        {1,1,1,1,1},
    },
    // F
    {
        {1,1,1,1,1},
        {1,0,0,0,0},
        {1,1,1,1,0},
        {1,0,0,0,0},
        {1,0,0,0,0},
    },
};

#define INPUT_DATA_WIDTH  4
#define INPUT_DATA_HEIGHT 8
char input_data[INPUT_DATA_HEIGHT][INPUT_DATA_WIDTH] = {
  {'F',  'D',  'A',  'E'},
  {'E',  'F',  'F',  'C'},
  {'A',  'A',  'C',  'C'},
  {'C',  'C',  'E',  'B'},
  {'B',  'B',  'B',  'A'},
  {'A',  'C',  'F',  'A'},
  {'A',  'C',  'C',  'B'},
  {'A',  'A',  'E',  'E'},
};

#define OUTPUT_DATA_WIDTH  INPUT_DATA_WIDTH*CHAR_DATA_WIDTH
#define OUTPUT_DATA_HEIGHT INPUT_DATA_HEIGHT*CHAR_DATA_HEIGHT
int output_data[OUTPUT_DATA_HEIGHT][OUTPUT_DATA_WIDTH] = {};

void CopyCharacterToOutput(int start_x, int start_y, char character)
{
    for(int y=0;y<CHAR_DATA_HEIGHT;y++)
        for(int x=0;x<CHAR_DATA_WIDTH;x++)
            output_data[y+start_y][x+start_x] = character_data[character-'A'][y][x];
}

void ConvertInputToOutput()
{
    for(int y=0;y<INPUT_DATA_HEIGHT;y++)
        for(int x=0;x<INPUT_DATA_WIDTH;x++)
            CopyCharacterToOutput(x*CHAR_DATA_WIDTH,y*CHAR_DATA_HEIGHT,input_data[y][x]);
}

void PrintInput()
{
    printf("Input: \n\n");
    for(int y=0;y<INPUT_DATA_HEIGHT;y++)
    {
        printf("  ");
        for(int x=0;x<INPUT_DATA_WIDTH;x++)
            printf(" %c",input_data[y][x]);
        printf("\n");
    }
    printf("\n");
}

void PrintOutput()
{
    printf("Output: \n");
    for(int y=0;y<OUTPUT_DATA_HEIGHT;y++)
    {
        if (y%CHAR_DATA_HEIGHT == 0)
            printf("\n");
        printf("  ");
        for(int x=0;x<OUTPUT_DATA_WIDTH;x++)
        {
            if (x%CHAR_DATA_WIDTH == 0)
                printf(" ");
            printf(" %d",output_data[y][x]);
        }
        printf("\n");
    }
    printf("\n");
}

int main()
{
    PrintInput();
    ConvertInputToOutput();
    PrintOutput();

    return 0;
}

试试https://onlinegdb.com/HyLwVkw7u

【讨论】:

  • 嗨。非常感谢您的回答。我将尝试将您对我的问题的解决方案实施到我的程序中,祝您有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多