我有一个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
*已更新
答案 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;
}