c++ - 在 C++ 中返回二维数组
问题描述
我是 C++ 的新手,我在 python 中进行物理模拟,这需要永远完成,所以我决定切换到 C++,我不明白如何创建一个返回 2D 数组(或 3D 数组)的函数)
#include <iostream>
#include <cmath>
// #include <complex> //
using namespace std;
double** psiinit(int L, int n, double alpha){
double yj[400][400] = {};
for (int j = 0; j < n; j++)
{
double xi[400] = {};
for (int i = 0; i < n; i++)
{
xi[i] = exp(-(pow((i-(L/4)), 2) + (pow((j-(L/4)), 2)))/alpha) / (sqrt(2)*3.14159*alpha);
};
yj[j] = xi;
};
return yj;
}
int main(){
int L = 10;
int n = 400;
int nt = 200*n;
double alpha = 1;
double m = 1;
double hbar = 1;
double x[n] = {};
double y[n] = {};
double t[nt] = {};
double psi[nt][n][n] = {};
psi[0] = psiinit(L, n, alpha);
cout << psi <<endl;
return 0;
}
我一直在寻找答案,但似乎不适用于我的问题
谢谢
解决方案
如果您是 C++ 新手,您应该阅读堆和堆栈的概念以及堆栈帧。有很多很好的资源。
简而言之,当你声明一个 C 风格的数组(yj
比如返回的数组。
有 3 个选项:
- 将数组作为输出参数传递给函数(非常 C 风格,不推荐)。
- 将数组包装在一个类中(就像
std::array
已经为您所做的那样),在这种情况下,它保留在堆栈上,并在返回时被复制到调用框架,但是它的大小必须在编译时知道。 - 在堆上分配数组并返回它,在我看来这最适合你的情况。
std::vector
为您做到这一点:
std::vector<std::vector<double>> psiinit(int L, int n, double alpha){
std::vector<std::vector<double>> yj;
for (int j = 0; j < n; j++)
{
std::vector<double> xi;
for (int i = 0; i < n; i++)
{
const int value = exp(-(pow((i-(L/4)), 2) + (pow((j-(L/4)), 2)))/alpha) / (sqrt(2)*3.14159*alpha);
xi.push_back(value);
}
yj.push_back(xi);
}
return yj;
}
如果您关心性能并且所有内部向量的大小都是固定的N
,那么使用std::vector<std::array<double, N>>
.
推荐阅读
- docker - 尝试连接到 Redis 会返回 ECONNREFUSED
- codeigniter - 如何在codeigniter的一个查询中使用insert方法和select方法?
- javascript - JavaScript if/else 语句返回一个记录的答案
- c++ - SonarQube C++ build-wrapper 产生空的 build-wrapper-dump.json
- android - Android:更改动态添加的开关颜色
- plugins - 在 Dynamics CRM 2015 中应用路由规则触发消息
- php - 发生上传错误时,PHP ssh2_scp_send() 的进程不会退出
- javascript - 如何将 react js 中的普通表转换为下一个使用 react bootstrap 表
- excel - 更改 xlam udf 目标单元格格式
- c# - 使用从 xls 文件读取的数据集更新单元格并保存到 CSV 文件