使用 C 中的 memcpy 将 2D 矩阵复制到 3D 矩阵

标签 c arrays matrix memcpy

我被指示使用单个 memcpy 命令将所有元素从我的二维数组 matrix2D 复制到我的 3d 数组 matrix3D 然后打印出 3d 数组(用逗号分隔元素,用分号分隔行,每个 2d 矩阵用新行分隔)。在此之前,程序接受用户输入的 3d 矩阵维度,然后将所有数据输入矩阵( float )。我的函数 malloc2dmalloc3d 工作正常,我没有遇到段错误,但是当我尝试 memcpy 数据然后打印 3d矩阵,没有打印。这是代码:

#include "utilities.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    unsigned int dim1,dim2,dim3;
    printf("Dimensionality of 3-D matrix ===>");
    scanf("%u",&dim1); //takes user input for dimensions
    scanf("%u",&dim2); //takes user input for dimensions
    scanf("%u",&dim3); //takes user input for dimensions

    //allocating memory for 3d, 2d and 1d matrices
    float*** matrix3D = malloc3D((unsigned int)(dim1), (unsigned int)(dim2), (unsigned int)(dim3), sizeof(float));
    float** matrix2D = malloc2D(dim1, dim2*dim3, sizeof(float));
    float* matrix1D = malloc(dim1*dim2*dim3);

    for(int i = 0; i<(dim1*dim2*dim3); i++){ //taking user input floats
        fscanf(stdin, "%f", &matrix1D[i]);
    }//for

    for(int i = 0; i<(dim1*dim2*dim3); i++){//writing contents of 1d matrix to 2d matrix
        matrix2D[i/(dim2*dim3)][i%(dim2*dim3)] = matrix1D[i];
    }//for

    for (int i = 0; i < dim1; i++){//printing out 2d array as asked
        for (int j = 0; j < (dim2*dim3); j++){
            printf("%0.2f", matrix2D[i][j]);
            if(j==((dim2*dim3)-1)){
                printf(";");
            }//if
            else{
                printf(",");
            }//else
        }//for
    }//for

    printf("\n"); //new line for readability 

    memcpy(matrix3D, matrix2D, dim1*dim2*dim3*sizeof(float));    

    for (int i = 0; i < dim1; i++){//printing out 3d array as asked
        for (int j = 0; j < dim2; j++){
            for(int k = 0; k < dim3; k++){
                printf("%0.2f", matrix3D[i][j][k]);
                if(j==((dim2)-1)){
                    printf(";");
                }//if
                else if(k==((dim3)-1)){
                    printf("\n");
                }//else if
                else{
                    printf(",");
                }//else
            }//for
        }//for
    }//for

    free3D(matrix3D);
    free2D(matrix2D);
    free(matrix1D);

} //main

给出的示例输入和输出是(除了最后两行 - 3d 矩阵,我打印了所有内容):

example input/output

这里有 malloc2D、malloc3D、free2D 和 free3D。我的印象是他们是对的,因为他们是在我们都没有得到它之后才给我们的。

void** malloc2D(size_t rows, size_t cols, size_t sizeOfType){
    void* block = malloc(sizeOfType * rows * cols);
    void** matrix = malloc(sizeof(void*) * rows);
    for (int row = 0; row < rows; ++row) {
        matrix[row] = block + cols * row * sizeOfType;
    }//for
    return matrix;
}//malloc2D

void free2D(void*** matrix){
    free((*matrix)[0]);
    free((*matrix));
    *matrix = NULL;
}//free2D

void*** malloc3D(size_t depth, size_t rows, size_t cols, size_t sizeOfType){
    void* block = malloc(sizeOfType * rows * cols * depth);
    void** matrix = malloc(sizeof(void*) * rows * depth);
    void*** matrix2 = malloc(sizeof(void**) * depth);
    for (int depth1 = 0; depth1 < depth; ++depth1) {
        matrix2[depth1] = (void**)(matrix + depth * rows * sizeof(void**));
        for(int row = 0; row < rows; ++row){
            matrix[depth1 * rows + row] = block + (depth1 * rows + row) * cols * sizeOfType;
        }//for
    }//for
    return matrix2;
}//malloc3D

void free3D(void**** matrix){
    free((*matrix)[0][0]);
    free((*matrix)[0]);
    free((*matrix));
    *matrix = NULL;
}//free3D

最佳答案

使用单个 memcpy 将 2d 数组复制到 3d 数组的唯一方法是,如果每个 2d 和 3d 数组的数据在内存中都是平坦的。

为您提供的分配函数表明每个函数的数据都是连续的。因此,需要将二维数组的数据段复制到三维数组的数据段中。

由于数据是连续的,因此数据部分位于数组第一个元素的地址。因此,二维数组的数据部分开始于 &matrix2D[0][0],而三维数组的数据部分开始于 &matrix3D[0][0][0]。鉴于数组语法的语义,这些表达式分别与 matrix2D[0]matrix3D[0][0] 相同。

假设 matrix1D 被正确初始化:

memcpy(matrix2D[0], matrix1D, dim1*dim2*dim3*sizeof(float));
memcpy(matrix3D[0][0], matrix2D[0], dim1*dim2*dim3*sizeof(float));

关于使用 C 中的 memcpy 将 2D 矩阵复制到 3D 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48893797/

相关文章:

html - 如何垂直填充表格数据?

c++ - Intel Xeon Phi 上的动态内存变慢

c - 二维矩阵中最小的 3 个元素

c++ - 在 C++/Linux 中设置单调时钟的一些技巧

c - 如何检查 C 中的 fscanf 错误

c++ - 我的 do while 循环只执行一次

arrays - 快速创建图像数组

c - 为什么 "sys_clone"定义在 "./arch/h8300/kernel/process.c"中?

使用大量元素和数组将 Javascript 重写为 DRY

algorithm - 在矩阵中寻找到 X 的路径