指向数组部分的指针

Posted

技术标签:

【中文标题】指向数组部分的指针【英文标题】:Pointer to portions of array 【发布时间】:2021-10-22 12:40:10 【问题描述】:

我有一个std::vector<std::array<double, 16>>的对象

vector entry    Data
[0]           - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[1]           - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[2]           - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[...]         - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

这旨在以 ravel 格式表示一个 4x4 矩阵。

为了不重复信息,我想创建一个指针以从上述结构中提取 3x3: 我有 3x3 结构的数学运算 (std::array<double, 9>)

someStructure:指向数据元素[0, 1, 2, 4, 5, 6, 8, 9 10]

最终目标是:std::array<double, 9> tst = someStructure[0] + someStructure[1];

这可行吗?

最好的问候

【问题讨论】:

向量的相关性是什么?一个 4x4 矩阵只有 16 个元素,并且由向量的单个元素表示,对吧? 它代表一个矩阵块 我建议你给自己一个矩阵库。没有办法只使用您拥有的结构获得指向内部(嵌套)3x3 矩阵的指针。 您的 3x3 矩阵不会是一块连续的内存,因此引用 aka std::array<double, 9> 并不可行 这里不太了解std::valarray,它能够做这样的事情。 【参考方案1】:

3x3 部分不连续,因此单独的指针在这里无济于事。

您可以编写一个view_as_3x3,它允许您访问4x4 的子矩阵的元素,就好像它是连续的一样:

struct view_as_3x3 
    double& operator[](size_t index) 
        static const size_t mapping[] = 0, 1, 2, 4, 5, 6, 8, 9, 10;
        return parent[mapping[index]];
    
    std::array<double, 16>& parent;
;

例如这样的

for (size_t = 0; i< 9; ++i) std::cout << " " << view_as_3x3orignal_matrix[i];

正在打印原始 4x4 original_matrix 的 3x3 子矩阵的 9 个元素。

然后,您可以更轻松地将 3x3 算法应用于 4x4 矩阵的 3x3 子矩阵。您只需将std::array&lt;double, 9&gt; 替换为一些通用的T。比如改变

double sum_of_elements(const std::array<double, 9>& arr) 
       double res = 0;
       for (int i=0;i <9; ++i) res += arr[i];
       return res;

收件人:

template <typename T>
double sum_of_elements(const T& arr) 
       double res = 0;
       for (int i=0;i <9; ++i) res += arr[i];
       return res;

然后调用

 std::array<double, 16> matrix4x4;
 sum_of_elements(view_as_3x3matrix4x4);
 // or
 std::array<double, 9> matrix3x3;
 sum_of_elements(matrix3x3);

使用迭代器代替索引会更好,但是,使用自定义迭代器编写视图需要大量样板文件。另一方面,我不建议首先使用裸std::arrays,而是使用一些my_4x4matrix,它将数组作为成员并提供迭代器和更多方便的方法。

【讨论】:

如果我为 3x3 矩阵定义了操作,是否可以将 view_as_3x3 结构声明为 3x3 矩阵并使其具有可用于 3x3 矩阵的所有操作? @ManuelOliveira 答案的最后一部分是关于这个的。当您对 3x3 矩阵的操作被编写为通用算法(模板或使用迭代器)时,您可以将它们与 view_as_3x3 或 3x3 矩阵一起使用 感谢您的回复!但是,当我运行代码时,我得到:error: passing ‘const view_as_3x3’ as ‘this’ argument discards qualifiers [-fpermissive]。我认为double&amp; operator[](size_t index)末尾缺少const另外,数字9和10之间的映射中缺少逗号。 @ManuelOliveira 我修复了丢失的,。缺少const 是因为答案只是勾勒了这个想法。一个正确的实现应该有一个非常量和一个常量重载(这将返回一个const double&amp; ...也许还应该有一个const_view。不知道什么是处理两者的最佳设计

以上是关于指向数组部分的指针的主要内容,如果未能解决你的问题,请参考以下文章

指向数组部分的指针。重载 [] 运算符以访问数组的各个部分

C语言指向二维数组的指针

C:指向结构指针数组的指针(分配/解除分配问题)

使用指向结构数组的指针不会返回完整的数组

函数指针

定义了一个常数组,为啥能用指针改变数组元素的值?