首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用向量执行数组计算?

如何使用向量执行数组计算?
EN

Stack Overflow用户
提问于 2014-04-13 16:17:32
回答 3查看 69关注 0票数 0

我一直在阅读,在许多地方,向量被推荐而不是数组,但我仍然没有完全理解,我也不确定它们是否能在我的项目中工作。

我在做CFD计算,我得做如下的计算,

代码语言:javascript
复制
for(int i = 1 ; i < M ; i++) {
    for(int j = 1 ; j < N ; j++) {
        for(int k = 0 ; k < 4 ; k++) {
            dU_dX_plus=(U[i+1][j+1][k]+dU_dT[i+1][j+1][k]*dt/2+U[i+1][j][k]+dU_dT[i+1][j][k]*dt/2-2*U_p[i][j][k])/dx;
            dU_dX_min=-(U[i][j+1][k]+dU_dT[i][j+1][k]*dt/2+U[i][j][k]+dU_dT[i][j][k]*dt/2-2*U_p[i][j][k])/dx;
            dU_dX[i][j][k]=Wfunct(dU_dX_plus, dU_dX_min);

            dU_dY_plus=(U[i+1][j+1][k]+dU_dT[i+1][j+1][k]*dt/2+U[i][j+1][k]+dU_dT[i][j+1][k]*dt/2-2*U_p[i][j][k])/dy;
            dU_dY_min=-(U[i][j][k]+dU_dT[i][j][k]*dt/2+U[i+1][j][k]+dU_dT[i+1][j][k]*dt/2-2*U_p[i][j][k])/dy;
            dU_dY[i][j][k]=Wfunct(dU_dY_plus, dU_dY_min);
        }
    }
}

我能用向量实现它吗?如果是的话,我怎么做呢?值得吗?还是应该继续使用数组?

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-13 16:22:56

vector有一个优点,就是直接在堆上分配内存。这意味着您也可以使用相当大的数组。这对于3D阵列尤其重要。记住:大小为100x100x100的浮动数组占用4MB内存--在大多数情况下对堆栈来说太大了。

通过使用vector而不是固定大小的数组,还可以实现具有动态大小的数组,即在运行时不固定。

你可以这样做:

代码语言:javascript
复制
struct Array3D {

    int N, M, K; // size of array

    std::vector<float> U; // storage

    Array3D(unsigned n, unsigned m, unsigned k)
    : N(n), M(m), K(k), U(n*m*k) {}

    float index(unsigned i, unsigned j, unsigned k) const {
        return (i*M + j)*K + k;
    }

    float operator()(unsigned i, unsigned j, unsigned k) const {
        return U[index(i,j,k)];
    }

    float& operator()(unsigned i, unsigned j, unsigned k) {
        return U[index(i,j,k)];
    }
};

Array3D U(6,7,8);
U(1,2,3) = U(2,3,4) + U(2,3,2);

就我个人而言,我认为U(i+1,j+1,k)U[i+1][j+1][k]更具可读性和可写性。

您也可以使用数组

票数 3
EN

Stack Overflow用户

发布于 2014-04-13 18:33:35

std::vector不过是堆分配数组和数组大小的包装器。你可以用一个向量做任何事情,而你可以用一个堆分配的数组。

std::vector通常推荐使用原始c++数组,原因有二:

  1. 因为std::vector是类型安全的。原始数组忘记了它们是数组,很容易忘记它们的大小,这可能导致无效的内存访问。
  2. 因为std::vector管理堆分配数组的生存期,而不需要手动使用new[]delete[],这很容易出错。

std::vector的一个缺点是它不像多维数组那样方便使用。

代码语言:javascript
复制
double U[M][N][4];
U[i][j][k];

您可以将多维数组扁平化为一个一维:

代码语言:javascript
复制
std::vector<double> U(M * N * 4);
U[N*4*i + 4*j + k]

另一种选择是编写您自己的类型--资源管理类,它充当多维数组。

代码语言:javascript
复制
class _2d_array {
  std::vector<double> arr;
public:
  const int rows, columns;
  _2d_array(int rows, int columns) : arr(rows * columns), rows(rows), columns(columns) {}

  struct row_proxy {
    _2d_array &arr;
    int row;
    double &operator[] (int column) { return arr.arr[arr.columns*row + column]; }
  };

  row_proxy operator[] (int row) { return row_proxy{*this, row}; }
};

_2d_array U(M, N);
U[i][j] = 10.23;
票数 1
EN

Stack Overflow用户

发布于 2014-04-13 16:30:00

. vectors已经被推荐到arrays之上,但我仍然不完全理解,我也不确定他们是否能在我的项目上工作。

arrays是C++ 11的一个特性。它们的大小也是固定的。

vectors是现成的。它们是动态的,可以改变大小。

用任何最适合你的情况的方法。如果您需要C++03,那么您必须使用vector。如果需要扩展数组,则使用vector

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23045113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档