指向数组部分的指针
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 矩阵不会是一块连续的内存,因此引用 akastd::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<double, 9>
替换为一些通用的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::array
s,而是使用一些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& operator[](size_t index)
末尾缺少const
另外,数字9和10之间的映射中缺少逗号。
@ManuelOliveira 我修复了丢失的,
。缺少const
是因为答案只是勾勒了这个想法。一个正确的实现应该有一个非常量和一个常量重载(这将返回一个const double&
)
...也许还应该有一个const_view
。不知道什么是处理两者的最佳设计以上是关于指向数组部分的指针的主要内容,如果未能解决你的问题,请参考以下文章