【问题标题】:C++ - dynamic pointer of arrayC++ - 数组的动态指针
【发布时间】:2009-12-12 12:55:09
【问题描述】:

首先我想说我是 C++ 的新手。

作为我硕士论文的一部分,我正在用 C++ 编写一个程序,它还将变量md(均为整数)作为参数。 d 是 2 的幂(这意味着 2^d 元素)。参数m 定义了一个元素与整个组(2^d 元素)之间可能的交互次数。

可能的交互次数计算如下:

\kappa = \sum_{i=0}^m\binom{d}{i}

(目前我为2^d x \kappa 生成向量向量,但我的教授希望我为不同的m 创建不同的统计数据。我的第一个想法是生成@ 的动态数组987654330@ 不同大小的数组...然后我虽然定义了一个 3-dim 数组和最大的所需 2d 数组,但程序速度也很重要(例如d = 20)。

我想请教您如何定义这种也很快的动态数组。

问候

【问题讨论】:

  • 如果数组和数学速度对你很重要,我不得不问你为什么不使用 FORTRAN 而不是 C++?
  • 真的吗?我认为 blitz++ 已经证明,在高性能数字运算方面,C++ 可以与 FORTAN 竞争
  • 您使用的是原生 C++ 向量,还是标准库中的 vector 类?
  • 在我开始编程之前,我告诉自己我不会 C++ 或 FORTRAN,所以我选择了 C++,因为我知道它将来会更有用,也许也更容易应用多线程计算。

标签: c++ arrays dynamic


【解决方案1】:

使用 boost 多维数组

http://www.boost.org/doc/libs/1_41_0/libs/multi_array/doc/index.html

例如看看这段代码。这很容易

#include "boost/multi_array.hpp"
#include <cassert>

int main () {
  // Create a 3D array that is 3 x 4 x 2
  typedef boost::multi_array<double, 3> array_type;
  typedef array_type::index index;
  array_type A(boost::extents[3][4][2]);

  // Assign values to the elements
  int values = 0;
  for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j)
      for(index k = 0; k != 2; ++k)
        A[i][j][k] = values++;

  // Verify values
  int verify = 0;
  for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j)
      for(index k = 0; k != 2; ++k)
        assert(A[i][j][k] == verify++);

  return 0;
}

【讨论】:

  • Boost 是否支持锯齿状数组?我认为这就是 Eagle 想要的。
  • 我之前在 boost 项目中看过,也看到了这段代码,但是使用 boost 多数组类型,你需要在编译时定义大小,我只在运行时知道维度的大小(执行)。假设在我的情况下 m = 3,但我的另外两个维度对于所有 m 的大小都不相同。
  • 让我们忘记关于 accues 速度的讨论,使用 vector > > 将生成一个 [m][n][p] 数组,它比我需要的更大.对于 m = 0,我需要一个 [n_0][p_0] 的数组,对于 m = 1,我需要一个 [n_1][p_1] 的数组,等等 n_0 \neq n_1 等等。我还可以定义 n_max = max( n_0,n_1,...) 和 p_max = max(p_0,p_1,...) 并生成 [m}[n_max][p_max],但我担心这种代码实现会降低速度性能...
  • 您可以为vector >中的每个元素调用.resize(),vector >也是如此
  • Doc Brown,能否请您写一个如何将元素添加到 vector > 的示例?也可以使用 push_back(),这也是一种调整大小。
猜你喜欢
  • 2017-07-03
  • 2015-03-29
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
相关资源
最近更新 更多