0

在下文中,我将使用类型定义:

typedef float zreal;
typedef float* zvect;
typedef float** zmatr;

假设我有一个zvect总长度n,我想将它重铸为一个zmatrm列的(当然假设m除以n)。“zvect对象”按行打包值zmatr,即它是a = [a1 a2 ... ap]where ais 的类型zvect(被认为是行向量)。我需要将其转换为zmatr如下所示:

zmatr = [a1
         a2
         ...
         ap]

其中a1,...,ap代表行向量。有没有办法将 my 重铸zvect为 a zmatr(无需将值复制到新实体)?最有效的方法是什么?请注意,我希望避免直接使用向量访问矩阵的值,例如z[getIndex(i,j,ncols)];where getIndex(int i,int j, int ncols)returns 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]);
}
4

1 回答 1

0

这些是非常不同的,不能转换:

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];

这是清晰、简洁和明确的。

于 2013-01-23T18:46:34.167 回答