【问题标题】:Fortran array access via vector subscripts, cpp equivalent通过向量下标访问 Fortran 数组,等效 cpp
【发布时间】:2020-01-01 22:53:35
【问题描述】:

我想知道是否有一个 cpp 相当于通过存储在其他数组中的索引访问 fortran 中的数组位置

我是 cpp 新手,但在 oop fortran 方面经验丰富。我正在考虑将 fortran 抛在后面,以便在最近的 cpp 中更好地支持 oop(fortran 中的 oop 可能处于 2000 年 cpp 的阶段)。

但是,我的应用程序主要面向线性代数。与 cpp 相反,fortran 有很多内置的编译器支持这一点。但我很乐意在 cpp 中加载库以获得详细的 oop 支持。

但是如果 cpp 中缺少以下构造,那将非常烦人。

由于我还没有找到任何相关内容,如果有经验的 cpp 程序员可以发表评论,我将不胜感激。

使用级联向量下标在 fortan 中分配一维数组位置可能很复杂,如下所示:

iv1(ivcr(val(i,j)))=1

其中 iv1 是一维整数向量,ivcr 是一维整数向量,val 是二维整数数组,i 和 j 是标量。我想知道我是否可以在 cpp 中以类似的紧凑形式编写它。

一个稍微复杂一点的例子是:

iv1(ivcr(val(i:j,j)))=1

这将用“1”填充iv1中的一个部分。

cpp 将如何以尽可能最短的方式处理该问题。

【问题讨论】:

  • std::vectorstd::fill() 怎么样?
  • 如果你想要 C++ 的线性代数,我推荐Eigen。它是一个只提供头文件的库,提供类似于 Matlab 的接口。它具有您正在寻找的索引切片符号。
  • std::valarraystd::indirect_array 应该在这里提及。

标签: c++ arrays vector subscript


【解决方案1】:

给定(适当初始化):

std::vector<int> iv1, ivcr;
std::vector<std::vector<int>> val;

那么你的iv1(ivcr(val(i,j)))=1 就是

iv1[ivcr[val[i][j]]] = 1;

至于iv1(ivcr(val(i:j,j)))=1,或者只是val(i:j, j),没有内置的方法可以像这样分割成数组。为了能够将1 分配给这些类型的嵌套数据结构访问,您需要提供表达式模板的数据结构。 Eigen 库就是这样,它是 C++ 的主要线性代数库之一。在此处查看他们的索引和切片文档:

https://eigen.tuxfamily.org/dox-devel/group__TutorialSlicingIndexing.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2014-07-26
    • 2019-11-16
    • 2015-08-02
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    相关资源
    最近更新 更多