具有两个动态维度和一个静态维度的多维数组

Posted

技术标签:

【中文标题】具有两个动态维度和一个静态维度的多维数组【英文标题】:multi-dimensional array with two dynamic dimension and one static dimension 【发布时间】:2019-01-04 19:09:17 【问题描述】:

我知道我可以像这样声明一个具有一个动态维度的数组:

double(*LHS)[3][3][3] = new double[M + 2][3][3][3];

但我需要声明一个具有“两个”动态维度的数组。我检查了如下语法:

double (**U)[3] = new double*[M + 2][3];    
for (int i = 0; i < M + 2; ++i) U[i][3] = new double[N + 2][3];

但它不起作用!

请帮我正确定义一个动态维度的三维数组。

【问题讨论】:

使用简单的std::vector怎么样? 数组是 XXX 的一大难题。考虑使用std::vector&lt;std::vector&lt;std::array&lt;double, KNOWN_SIZE&gt;&gt;&gt; 使用std::arraystd::vector 看起来 std::vector&lt;std::array&lt;double, 27&gt;&gt; 就足够了,然后您将最后 3 个坐标映射到从 0 到 26 的索引(例如 x + 3*y + 9*z)。 @πάνταῥεῖ 你能从已删除的问题中复制你的答案吗? 【参考方案1】:

你可以用什么来调用函数

void SolveBlockTri(double LHS[][3][3][3], double RHS[][3], int iNRows)

使用具有动态分配的惯用 c++ 技术是:

int nRows = 42;
std::vector<std::array<std::array<std::array<double>,3>,3,3> lhs; 
    // = where ever you fill that from;
std::vector<std::array<double,3>> rhs,nRows);

SolveBlockTri(&(lhs.data()), &(rhs.data()), nRows);   

您还可以根据固定大小部分使用模板化包装函数:

template<size_t FixedSize>
void CallSolveBlockTri(
    const std::vector<std::array<std::array<std::array<double>
                     ,FixedSize>,FixedSize,FixedSize>& LHS
  , std::vector<std::array<double,FixedSize>>& RHS
  , int iNRows) 
    SolveBlockTri(&(LHS.data()), &(RHS.data()), iNRows);
;

但我发现声明一个 4d 动态数组(然后删除它!)非常复杂。

请注意,使用上面列出的两种解决方案,您无需使用 newdelete 运算符进行任何手动数组分配。 容器类 std::vectorstd::array 已经可以正确处理所有这些内容了。

【讨论】:

以上是关于具有两个动态维度和一个静态维度的多维数组的主要内容,如果未能解决你的问题,请参考以下文章

多维数组

在 Julia 中定义任意维度的多维数组

C# - 更改多维数组元素类型

R语言数组数据框因子

python如何减小维度

如何从多维数组中获取维度(切片)