在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的提示帮助我记下了上面的代码(参见问题中的更新)。