C矩阵" crop"功能

时间:2016-12-07 20:29:37

标签: c matrix

我获得了一个动态分配的维度宽度 x 高度元素矩阵。我需要" crop"由矩形定义的矩阵的一部分:(start_col,start_line)(end_col,end_line)

示例:

给定矩阵(3 * 3):

redis-benchmark

和弦:(1,1)(1,1)

结果矩阵是:

1 2 3
4 5 6
7 8 9

我该怎么做?

我的矩阵由如下结构元素组成:

5

所以我声明并分配了这样的矩阵:

typedef struct Pixel{
   int R;
   int G;
   int B;
}Pixel;

现在我应该如何使用realloc来保留我需要的小子矩阵?

2 个答案:

答案 0 :(得分:0)

你可以分配与列相同的行(所以它们只是像素的指针,而不是像素本身)然后你可以:

  • 创建“较小”的表格和参考像素到新表格(也许可以免费使用一次)
  • 移动它们以启动并重新分配整个矩阵
  • 将所有“未使用”的像素设置为NULL,非NULL的所有内容都是裁剪后的图像。
  • 将结构或指针返回到裁剪的起始点(起始像素的[x] [y]或指向像素的指针)。和[宽度[右侧多少个像素] /高度[左侧多少个像素]裁剪 - 这样您就不必更改结构就可以处理裁剪后的图像。

答案 1 :(得分:0)

  

现在我应该如何使用realloc来保留我需要的小子矩阵?

首先,您可以释放不被保留的行'数据。然后,在您移动剩余的行之后'数据和指向各自存储空间开头的指针,你可以realloc空格,e。 G:

void crop(Pixel ***img, int start_col, int start_line,
                        int * end_col, int * end_line)
{
    Pixel **imp = *img;
    // free the memory space of the to-be-dropped row data
    for (int i = 0;     i < start_line; ++i) free(imp[i]);
    for (int i = * end_line; ++i < height; ) free(imp[i]);
    // move the to-be-kept row pointers to start at row 0
    *end_line -= start_line;    // resulting last row
    size_t col_size = (*end_line+1) * sizeof *imp;  // resulting pointers' size
    memmove(imp, imp+start_line, col_size);
    // move the to-be-kept column data to start at column 0
    *end_col -= start_col;      // resulting last column
    size_t row_size = (*end_col+1) * sizeof **imp;  // resulting row data size
    for (int i = 0; i <= * end_line; ++i)
        memmove(imp[i], imp[i]+start_col, row_size),
        imp[i] = realloc(imp[i], row_size); // trim the memory space of the row
    *img = realloc(imp, col_size);  // trim the memory space of the row pointers
}

您可以将此功能称为:

    int end_col = 1, end_line = 1;
    crop(&img, 1, 1, &end_col, &end_line),  // yields new matrix and new ends
    height = end_line+1, width = end_col+1; // important: set new dimensions