将3D阵列的memcpy列转换为1D阵列

时间:2019-01-08 12:59:54

标签: c

我有一个3D数组Yuppies,我需要提取第一列并复制到一个1D数组mat中。

我尝试了以下代码,可以将arr的第一行复制到mat,但是我需要将arr的第一列复制到mat。有没有更好的方法来做到这一点而无需逐个复制元素?

arr

实际结果:

#include <stdio.h>
#include <string.h>

int main()
{
int mat[4][2][4] = {{{1,2,3,4},{10,20,30,40}},{{11,12,13,14},{110,120,130,140}},{{21,22,23,24},{210,220,230,240}},{{31,32,33,34},{310,320,330,340}}};
int arr[4];
int index,idx;

for(index=0;index<4;index++){
    memcpy(arr, &mat[index][0], sizeof(arr));
    for(idx=0;idx<4;idx++){
        printf("%d\t",arr[idx]);
    }
    printf("\n");
}

return 0;
}

预期结果:

1   2   3   4   
11  12  13  14  
21  22  23  24  
31  32  33  34

*已更新

2 个答案:

答案 0 :(得分:3)

如果我很了解您想要的话:

#include <stdio.h>
#include <string.h>

int main()
{
  int mat[4][2][4] = {{{1,2,3,4},{10,20,30,40}},{{11,12,13,14},{110,120,130,140}},{{21,22,23,24},{210,220,230,240}},{{31,32,33,34},{310,320,330,340}}};
  int arr[2];
  int index,idx;

  for (index=0; index<4; ++index) {
    /* only set */
    for (idx=0; idx<2; ++idx) {
      arr[idx] = mat[index][idx][0];
    }

    /* only print */
    for (idx=0; idx<2; ++idx) {
      printf("%d\t", arr[idx]);
    }
    printf("\n");
  }

  return 0;
}

执行产生:

1   10  
11  110 
21  210 
31  310 

我故意分开了作业和打印循环,即使它们是相同的


但是对于最后一个维度仅使用索引0很奇怪,所以我认为实际上您想要这样做:

#include <stdio.h>
#include <string.h>

int main()
{
  int mat[4][2][4] = {{{1,2,3,4},{10,20,30,40}},{{11,12,13,14},{110,120,130,140}},{{21,22,23,24},{210,220,230,240}},{{31,32,33,34},{310,320,330,340}}};
  int arr[2];
  int idx0, idx1, idx2;

  for (idx2 = 0; idx2 != 4; ++idx2) {
    for (idx0=0; idx0<4; ++idx0) {
      /* only set */
      for (idx1=0;idx1<2;idx1++) {
        arr[idx1] = mat[idx0][idx1][idx2];
      }

      /* only print */
      for (idx1=0;idx1<2;idx1++) {
        printf("%d\t", arr[idx1]);
      }
      printf("\n");
    }
  }

  return 0;
}

执行产生:

1   10  
11  110 
21  210 
31  310 
2   20  
12  120 
22  220 
32  320 
3   30  
13  130 
23  230 
33  330 
4   40  
14  140 
24  240 
34  340

答案 1 :(得分:0)

如果要使用memcpy,数据必须是连续的。我将尝试使用以下代码进行解释。

第一部分:我使用您的矩阵向您显示内存中的数据顺序。

第二部分:我对数据进行重新排序(Rq:我认为,出于测试和理解的目的,每个维数最好具有不同数量的元素。例如[3] [2] [4],以避免混淆。尽管如此,我不要更改它以保留您的数据)

第三部分:我和您一样使用memcpy。

我有一个问题。您是否正在尝试将某些代码从fortran修改为C?

#include <stdio.h>
#include <string.h>

int main()
{
//First part
int mat[4][2][4]={{{1,2,3,4},{10,20,30,40}},{{11,12,13,14},{110,120,130,140}},{{21,22,23,24},{210,220,230,240}},{{31,32,33,34},{310,320,330,340}}};
int *ptr=mat;
int i=0;
for (int z=0; z<4; z++) for (int y=0; y<2; y++) for (int x=0; x<4; x++) printf("mat(%d,%d,%d)=%d\n",x,y,z,ptr[i++]);

printf("\n------------------------\n\n");

//Second part
/* int mat[4][2][4]=
    {{{1,2,3,4},            {10,20,30,40}},
    {{11,12,13,14},         {110,120,130,140}},
    {{21,22,23,24},         {210,220,230,240}},
    {{31,32,33,34},         {310,320,330,340}}}; */
// Written like that to show "a sort of matrix transposition" (do not take this words mathematically)of left and right part.

int mat1[4][2][4]={
    {{1,11,21,31},          {10,110,210,310}},
    {{2,12,22,32},          {20,120,220,320}},
    {{3,13,23,33},          {30,130,230,330}},
    {{4,14,24,34},          {40,140,230,340}}
};

int *ptr1=mat1;
i=0;
for (int z=0; z<4; z++) for (int y=0; y<2; y++) for (int x=0; x<4; x++) printf("mat(%d,%d,%d)=%d\n",x,y,z,ptr1[i++]);

//Third part
int arr[4];
int index,idx;

for(index=0;index<2;index++){
    memcpy(arr, &mat1[0][index], sizeof(arr));
    for(idx=0;idx<4;idx++){
        printf("%d\t",arr[idx]);
    }
    printf("\n");
}

return 0;
}