- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发布了一个用 C++ 编写的简单的 n-body 类 here在代码审查中。
我被告知要使用 std::valarray
而不是普通的 std::array
,目的是我可以重写一些目前看起来像这样的代码
void Particle::update_position() {
for (unsigned int d = 0; d < DIM; ++d) {
position[d] += dt*(velocity[d] + a*force_new[d]);
force_old[d] = force_new[d];
}
}
对此
void Particle::update_position() {
position += 0.1*(velocity + force_new);
force_old = force_new;
}
因为我是 C++ 的初学者,所以我写了一个使用 std::valarray
的小程序,这样我就可以学习如何使用这个数据结构。但是,编译器会抛出很多错误,我不知道为什么。我希望你能帮我解决这个问题。这是我写的小程序:
#include <iostream>
#include <vector>
#include <array>
#include <valarray>
constexpr unsigned int DIM = 2;
struct Particle{
std::array<std::valarray<double>, DIM> position;
std::array<std::valarray<double>, DIM> velocity;
std::array<std::valarray<double>, DIM> force_new;
std::array<std::valarray<double>, DIM> force_old;
void update_position();
};
void Particle::update_position() {
position += 0.1*(velocity + force_new);
force_old = force_new;
}
void compute_position(std::vector<Particle>& particles) {
for (auto& particle: particles) {
particle.update_position();
}
}
void print_data(const std::vector<Particle>& particles) {
for (const auto& particle: particles) {
for (const auto& x: particle.position) std::cout << x << " ";
for (const auto& v: particle.position) std::cout << v << " ";
for (const auto& F: particle.position) std::cout << F << " ";
std::cout << std::endl;
}
}
void init_data(std::vector<Particle>& particles) {
for (auto& particle: particles) {
for (const auto& p: particle) {
p.position = 1.0
p.velocity = 2.0
p.force_new = 3.0
p.force_old = 4.0
}
}
}
int main() {
const unsigned int n = 10;
std::vector<Particle> particles(n);
init_data(particles);
compute_position(particles);
print_data(particles);
return 0;
}
当我尝试编译这段代码时,出现以下错误:
so.cpp: In member function ‘void Particle::update_position()’:
so.cpp:17:31: error: no match for ‘operator+’ (operand types are ‘std::array<std::valarray<double>, 2>’ and ‘std::array<std::valarray<double>, 2>’)
position += 0.1*(velocity + force_new);
so.cpp: In function ‘void print_data(const std::vector<Particle>&)’:
so.cpp:29:58: error: no match for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘const std::valarray<double>’)
for (const auto& x: particle.position) std::cout << x << " ";
so.cpp: In function ‘void init_data(std::vector<Particle>&)’:
so.cpp:38:29: error: ‘begin’ was not declared in this scope
for (const auto& p: particle) {
^~~~~~~~
so.cpp:38:29: note: suggested alternative:
In file included from so.cpp:4:
/usr/include/c++/8/valarray:1211:5: note: ‘std::begin’
begin(const valarray<_Tp>& __va)
^~~~~
so.cpp:38:29: error: ‘end’ was not declared in this scope
for (const auto& p: particle) {
最佳答案
首先,当您编写或更改代码时,始终从第一个工作版本开始,并确保代码在每个步骤之间进行编译。这将使隔离错误编译代码变得更加容易。
为什么我要告诉你这个?这是因为您的部分代码从未正确编译过。无论是在引入 valarray 之前还是之后。
例如,这个:
for (auto& particle : particles) {
for (const auto& p: particle) {
p.position = 1.0
p.velocity = 2.0
p.force_new = 3.0
p.force_old = 4.0
}
}
单个粒子不是可迭代类型,行尾没有分号。
一步一步来,确保代码在每个步骤之间编译。
其次,我认为 valarray 不是您要找的东西。除非您希望每个粒子的每个属性都具有动态的维数,否则这将是非常令人惊讶的。
我建议您引入一个 vec 类型,它包含您进行简化所需的组件。这样的 vec 类型可以在库中找到,例如 glm
提供一个 vec2
类,其中包含 +-/*
等运算符。
即使没有库,也可以创建简单的 vector 类型。
这是一个使用 vector (在数学意义上)而不是 std::valarray
的代码示例:
struct Particle{
glm::vec2 position;
glm::vec2 velocity;
glm::vec2 force_new;
glm::vec2 force_old;
void update_position();
};
void Particle::update_position() {
position += 0.1*(velocity + force_new);
force_old = force_new;
}
void compute_position(std::vector<Particle>& particles) {
for (auto& particle: particles) {
particle.update_position();
}
}
void print_data(const std::vector<Particle>& particles) {
for (const auto& particle : particles) {
std::cout << particle.position.x << ", " << particle.position.y << " ";
std::cout << particle.velocity.x << ", " << particle.velocity.y << " ";
std::cout << particle.force_new.x << ", " << particle.force_new.y << " ";
std::cout << std::endl;
}
}
void init_data(std::vector<Particle>& particles) {
for (auto& particle : particles) {
particle.position = {1, 2};
particle.velocity = {2, 24};
particle.force_old = {1, 5};
particle.force_new = {-4, 2};
}
}
int main() {
const unsigned int n = 10;
std::vector<Particle> particles(n);
init_data(particles);
compute_position(particles);
print_data(particles);
return 0;
}
关于c++ - 在数值模拟中使用 std::valarray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58596867/
是的,这个has been asked before ,答案是: valarrays (value arrays) are intended to bring some of the speed of
看完这篇http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00123.html ,似乎标准不能保证使用 valarrays 的 valarrays 是安全的。但是当
STL 中valarray::min 和valarray::max 函数的时间复杂度是多少? 此外,什么是查找各种其他 STL 组件的时间/空间复杂性的良好来源? 最佳答案 O(N) 这些函数不会缓存
这是我在这里的第一篇文章,但我经常阅读这里的各种主题。 现在我被 c++ 的编程问题困住了,它基本上是一个名为“Pair”的模板类,它应该包含 2 个 valarrays 的整数,然后包含在另一个名为
出于兼容性目的,我正在开发一个具有 C 接口(interface)的库 void interface(double* context, size_t num_elements); 而 context
我有一些数据存储在 std::vector 中.我用它来创建一个 std::valarray来 self 的 std::vector . std:valarray corpX(corps_tmp[i]
当我将 valarray 除以它的第一个元素时,只有第一个元素变为 1,其他元素保持其原始值。 #include #include using namespace std; int main()
为什么 std::valarray 不支持自定义分配器?它的内存管理是怎么设计的?是否使用了基于new 或malloc 的分配器?所有其他容器通常都提供指定自定义分配器的可能性。比如说,libstdc
valarray 是否有连续内存对齐? 我想通过传递 &myValarray[0] 将一个 valarray 传递给一个只接受指针的函数(来自 IPPS)。但因此我应该确定,valarray 的内存对
以下程序: #include #include using namespace std; int main() { int init[] = {1, 1}; // Example 1 va
当我用 valarray 写一个简单的算术表达式时并将结果分配给 auto当我尝试在 gcc 上访问结果时出现段错误。 #include #include using std::ostream;
std::valarray myArray(3)产生 valarray长度为 3,初始化为零。 std::valarray myArray(1,3)产生 valarray长度为 3,初始化为 1。 s
我们可以初始化一个valarray来自基本的用户定义数组,如下所示: int arr[3]={0}; valarray test(arr, sizeof(arr)/sizeof(int)); 我们怎样
在下面的类中,当我尝试为 operator [] 返回 std::valarray& 时,它说:invalid initialization of std::valarray& from R - 值引
我发布了一个用 C++ 编写的简单的 n-body 类 here在代码审查中。 我被告知要使用 std::valarray 而不是普通的 std::array ,目的是我可以重写一些目前看起来像这样的
我在一个列表中有很多数据,比如每个元素有几千字节,我想逐个提取以进行一些数字处理。这些数据最初存储为 float[]。由于处理涉及大量索引和全局计算,我认为 valarray 可能易于编程。但是如果我
您好,我想构建一个辅助类来初始化一个 STL valarray。我想要的是执行以下操作: std::valarray vec(3); vlist_of(vec)(2)(3)(5); 所以我可以只使用一
我正在寻找静态大小的 std::valarray 实现。 我自己实现应该很容易,但我需要 constexpr 操作(加法、减法等),这有点无聊/容易出错,所以我在这里问一下是否有流行的实现。 如果我必
代码: #include #include using namespace std; int main() { valarray v0(2, 4); valarray v1; v
这可能是个愚蠢的问题。 关于 this我读过的网站 The valarray specification allows for libraries to implement it with sever
我是一名优秀的程序员,十分优秀!