在C语言中重铸/转换一维数组到二维数组
在以下内容中,我将使用类型定义:在C语言中重铸/转换一维数组到二维数组,c,pointers,C,Pointers,在以下内容中,我将使用类型定义: typedef float zreal; typedef float* zvect; typedef float** zmatr; 假设我有一个总长度n的zvect,我想用m列将其重新编码为zmatr(当然,假设m除以n)。zvect“对象”按行打包zmatr的值,即它是a=[a1a2…ap],其中a是zvect类型(被认为是行向量)。我需要将其转换为zmatr,如下所示: zmatr = [a1 a2 ...
typedef float zreal;
typedef float* zvect;
typedef float** zmatr;
假设我有一个总长度n
的zvect
,我想用m
列将其重新编码为zmatr
(当然,假设m
除以n
)。zvect
“对象”按行打包zmatr
的值,即它是a=[a1a2…ap]
,其中a
是zvect
类型(被认为是行向量)。我需要将其转换为zmatr
,如下所示:
zmatr = [a1
a2
...
ap]
其中,a1,…,ap
表示行向量。是否有办法将我的zvect
重新转换为zmatr
(无需将值复制到新实体)?最有效的方法是什么?注意,我希望避免直接使用向量访问矩阵的值,例如z[getIndex(I,j,ncols)]代码>其中getIndex(inti,intj,intncols)
返回i*ncols+j
。如有任何建议,将不胜感激
更新:以下代码似乎可以完成此任务:
zvect v;
create_vector(&v,100);
zmatr zm;
zmatr* matrix = &zm;
*matrix = (zmatr)malloc(sizeof (zvect) * 10);
int i;
for (i = 0; i < 10; ++i) {
(*matrix)[i] = &(v[i*10]);
}
zvectv;
创建_向量(&v,100);
zmatr-zm;
zmatr*矩阵=&zm;
*矩阵=(zmatr)malloc(sizeof(zvect)*10);
int i;
对于(i=0;i<10;++i){
(*矩阵)[i]=&(v[i*10]);
}
它们非常不同,无法转换:
typedef float* zvect;
typedef float** zmatr;
类型zvect
是指向float
或float
数组的指针
类型zmatr
是指向float*
或float*
数组的指针
+-------+ +-------+
| zvect | -------> | float |
+-------+ | float |
| float |
| ... |
+-------+
+-------+ +---------+ +-------+
| zmatr | -------> | float * | --------> | float |
+-------+ | float * | -- | float |
| float * | \ | ...
| ... | \
+---------+ \ +-------+
---> | float |
| float |
| ...
简而言之,zmatr
不是一个二维数组,它实际上是一个一维数组,包含指向作为元素的一维数组的指针
就我个人而言,我会坚持:
float elem = arr[i*ncols+j];
这是清晰、简洁和明确的。我没有设想像zmatr my_zmatr=(zmatr)my_zvect代码>当然!但是,如何从一维阵列创建二维阵列。我猜我的zmatr
只需要每行每个元素的第一个元素的地址…@PantelisSopasakis:是的,你可以这样做。当然,访问元素的速度要慢得多。请记住:zmatr
不是2D数组,它是一个包含指针的1D数组。与使用1D数组的情况相比,为什么访问2D数组(或者更好地称为1D指针数组)要“慢得多”?@PantelisSopasakis:访问2D数组的速度将与访问1D数组的速度相同。但是,指针的1D数组速度会慢一些,因为您必须访问内存两次才能获取元素,而不是一次。第二次提取依赖于第一次提取,这可能会导致管道暂停。@PantelisSopasakis:再说一遍,我们这里讨论的不是2D数组。这是一个1D指针数组(我觉得我在自言自语,因为没有人在听我说什么…)不建议使用malloc()的结果。您使用的是指向指向指针的指针吗?请突出你的问题。看起来很有趣,但我没有从中得到任何东西。@Sibrajas是的,你可以这样称呼它。我只想说,我正在使用一个指向“矩阵”(zmatr)的指针。如果我没有引入类型zmatr
,那么上面的代码中将有一个float***
。我在寻找最佳实践(如果有的话),以高效的方式将我的案例中的向量(即数组)转换为矩阵。Dietrich Epp的提示帮助我记下了上面的代码(参见问题中的更新)。