用C语言实现将512*512*100的三维数组转换成512*5120*10的三维数组,并打印输出转换后的三维数组
时间: 2024-09-09 15:06:48 浏览: 50
在C语言中,我们可以使用指针和内存操作来实现这样的转换。假设原数组名为`input3D`,是一个`uint8_t`类型的数组,其形状为`(512, 512, 100)`。我们需要将其压缩到`(512, 512 * 10, 1)`的形式,即`output3D`。下面是简化的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define ORIG_WIDTH 512
#define ORIG_HEIGHT 512
#define ORIG_DEPTH 100
#define NEW_WIDTH 512
#define NEW_DEPTH 10
// 原始数据类型和尺寸
typedef uint8_t Pixel;
Pixel input3D[ORIG_WIDTH][ORIG_HEIGHT][ORIG_DEPTH];
// 新的数据类型和尺寸
typedef struct {
Pixel data[NEW_WIDTH][NEW_HEIGHT][NEW_DEPTH];
} OutputArray;
// 将原数组压缩并存储到新数组中
OutputArray* compressArray() {
OutputArray* output = (OutputArray*)malloc(sizeof(OutputArray));
for(int i = 0; i < NEW_WIDTH; ++i) {
for(int j = 0; j < NEW_HEIGHT; ++j) {
int src_idx = i * ORIG_WIDTH + j * ORIG_WIDTH * ORIG_DEPTH;
for(int k = 0; k < NEW_DEPTH; ++k) {
output->data[i][j][k] = input3D[src_idx][k]; // 只保留第k维的数据
}
}
}
return output;
}
// 打印输出数组
void printArray(OutputArray* arr) {
for(int i = 0; i < NEW_WIDTH; ++i) {
for(int j = 0; j < NEW_HEIGHT; ++j) {
printf("Row %d, Col %d: ", i, j);
for(int k = 0; k < NEW_DEPTH; ++k) {
printf("%u ", arr->data[i][j][k]);
}
printf("\n");
}
}
}
int main() {
// ... 先填充好输入数组 input3D ...
OutputArray* compressed = compressArray();
if(compressed != NULL) {
printArray(compressed);
free(compressed); // 别忘了释放内存
} else {
printf("Memory allocation failed.\n");
}
return 0;
}
```
在这个示例中,我们首先创建了一个新的`OutputArray`结构体,然后通过嵌套循环逐元素复制原数组的内容,只保留每个新数组的一维。然后我们提供了一个`printArray`函数来打印这个新的、压缩后的数组。
阅读全文