问题标签 [valarray]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
338 浏览

c++ - 具有算术运算返回类型的 valarray

当我编写一个简单的算术表达式valarray并将结果分配给auto我尝试访问 gcc 上的结果时出现段错误。

参考资料说,实现可以选择算术运算重载的返回类型可能不是valarray-value 而是“表现得像它”的东西:

允许按值返回 valarray 的运算符返回不同类型的对象。这种类型需要隐式转换为 valarray 并支持作为所有采用 valarray& 参数的函数的参数。这允许写时复制实现。

好吧,我operator<<应该呼吁“隐式转换”,不是吗?

那么为什么会出现段错误?

gcc 版本 6.2.0 20160901 (Ubuntu 6.2.0-3ubuntu11~14.04)

当我尝试clang(在 linux 上,所以可能是 gcc 的 stdlib)时,我持怀疑态度,并且......它有效:

clang 版本 3.9.1-svn288847-1~exp1 (branches/release_39)

好吧,在我提交 gcc-bug 之前......我做错了吗?是我的auto恶吗?还是真的是gcc?

0 投票
1 回答
812 浏览

c++ - 对列表中任意元素的恒定时间访问 (C++)

我目前正在研究一种算法的实现,我想证明它可以在恒定时间内工作,即使有非常多的元素。

不幸的是,我需要一个数据结构来存储元素。当元素的数量非常多,但对于我的算法来说不是不合理的高时,std::vector 和 std::valarray 都不会在恒定时间内访问任意元素,如您在此图中看到的那样

是否有更好的数据结构来存储值?我可以实施任何技术来实现恒定时间访问吗?

0 投票
1 回答
1868 浏览

c++11 - C++11:我应该使用 valarray 还是 vector 进行数值计算

vector vs valarray 的问题已经在这里被问过了。我的问题专门针对 C++11 的情况。我一直在阅读“C++ 之旅”“C++ 编程语言”。这两本书均由 Bjarne Stroustrup 撰写。在第一本书中,作者解释说它std::valarray应该是数值计算的首选(第 12 章)。但是在第二本书的第 29 章中,作者根据std::vector.

同样通过进行一些谷歌搜索,似乎在性能方面, astd::vector与动态分配的“原始数组”一样快。

那么在 C++11 的上下文中,数值计算应该首选哪个容器呢?

我对此的看法是,由于使用( 它返回对数据的引用而不进行边界检查)std::vector提供对其内容的快速访问,并且在动态分配的数组上使用 a 也更安全,因此应该首选。此外,从 C++11 开始:operator[]std::vectorstd::vector

  • std::vector使用提供对基础数据的直接访问std::vector::data()
  • std::vector 可以调整大小以使用更少的内存std::vector::shrink_to_fit()
0 投票
0 回答
322 浏览

c++ - 使用 std::valarray 和 std::slice 复制跨步数据

我正在尝试有效地复制跨度数据。考虑以下函数签名

其中 Buffer 和 Array 是

现在,根据输入的常量,我可以切片valarray并得到另一个valarrayor slice_array。切片valarray会损害性能(副本)。有没有办法使用 复制切片数据slice_array

我天真的实现

但是,此实现比仅循环输入并按索引分配值要慢。

顺便说一句,我不受 valarray 的约束,以防你有更好的想法使用什么容器

EDIT001:再想一想,Range-V3 在这种情况下可能很方便ranges::v3::view::stride,但是我找不到任何使用它的例子


EDIT002:设法使范围工作。它非常慢,比简单的 for 循环慢 20 倍。

我做错了什么?

0 投票
1 回答
253 浏览

c++ - 如何整合 std::valarray用gsl?

我对 C++ 比较陌生,但我有一些(稀缺的)编码和数字经验。

我知道这个问题时不时地发布,你如何集成一个数组。在 MATLAB 中,你可以强制你的数组成为一个函数(我忘了怎么做,但我知道我以前做过)并将它发送给内置的积分器,所以我的问题是你如何在 C++ 中做到这一点。

我有这个积分:

q 只是 double const,z 是积分变量,但 A(z) 是一个数组(我从现在开始将其称为实际函数),它与我的代码中的 z 轴具有相同数量的点。积分边界是 z[0] 和 z[nz-1]。

我使用梯形规则计算了这个积分,对于 5000 点的 z 轴,这需要 0.06 秒。我的问题是这个计算大约发生了 300 * 30 * 20 次(我有 3 个 for 循环),这个 0.06 秒的时间很快增长到模拟的 3 小时。我的代码的整个瓶颈就是这种集成(我显然可以通过减少 z 来加速,但这不是重点。)

我知道库函数通常比用户编写的函数要好得多。我也知道我不能像辛普森规则那样使用更简单的东西,因为被积函数是高度振荡的,我想避免自己实现一些复杂的数值算法。

GSL 需要一个函数形式:

F = f(double x, void *params)

我可能可以使用 gsl 的 QAWO 自适应集成,但是如何使我的函数以将我的数组转换为函数的形式出现?

我在想一些事情:

这样的事情可能吗?我怀疑数值算法会使用与实际函数相同的空间差异,然后我应该以某种方式对实际函数进行插值吗?

有比gsl更好的东西吗?

0 投票
0 回答
786 浏览

c++ - std::valarray、std:vector 还是 arma::vec?

我不确定这是否是这个问题的地方,但它就在这里。

我正在研究 C++ 中的计算物理模型,我收到了一个正在整理的大代码。

该领域是量子电子学,所以有很多积分和表达式,但我的问题是关于优化。

最初代码需要 4 小时才能完成模拟,我在消除了几个瓶颈后将其整理到了 30 分钟。

我仍然不喜欢的是代码中的数据(主要是数组类型double)混合std::vector<(double)>std::valarray<(double)>和犰狳的arma::vec.

其中哪一种是最好的方法,我什至应该尝试为数组创建统一的数据类型?

我认为以前的博士生使用的原因valarray是它的友好性,因为运算符*, /, +,-超载并且有一些稀缺的在线承诺valarrays 比向量更快(关于此的在线大辩论)。犰狳被引入,因为它与 MATLAB 语法和文档库非常相似,并且std::vector<(T)>在 T 是类而不是双精度时保留。

我个人更喜欢犰狳,因为它的逻辑非常简单,感觉很自然,valarray有时会因为它们没有很多成员函数而让我烦恼,但是通过它们迭代很容易,向量很烦人,算术运算符不会重载 for <(double)>and if我选择了这些,我可能需要为 Array of s 创建自己的类,double而我真的不想这样做。

请记住,我不知道这些数组在内存中的行为方式,我去年开始使用 C++,还有很长的路要走。我计划为另外 2 个维度(目前是 1D)开发此代码,并且执行时间肯定会增加。

因此,我正在寻求关于我应该继续使用哪种数组类型的建议,以及我是否应该使代码统一(强制所有数组为double同一类型(std::valarraystd::vectorarma::vec

0 投票
1 回答
360 浏览

c++ - 为什么捕获 lambda 不能应用于 std::valarray?

什么不符合将 lambda 传递给apply方法的条件std::valarray?考虑以下代码:

住在科里鲁http://coliru.stacked-crooked.com/a/f0407046699574fc

在https://gcc.godbolt.org/上测试
GCC、MSVC 或 CLang 都不会编译上述代码

0 投票
1 回答
44 浏览

c++ - Wrong value from valarray after initialization

I'm trying to use std::valarray setting some initial values. Printing the array values, I get something different from what I expect. I'm on Windows (10) with CodeBlocks (GCC 4.9.2, C++11 build option).

Here is the code:

The output is:

0 投票
1 回答
2586 浏览

c++ - 在哪里使用“std::valarray”是个好主意?

我在Nicolai M. Josuttisstd::valarray写的 C++ 书中读到。他在他的书《C++ 标准库》第 17.4 章中写道:

valarray 类的设计不是很好。事实上,没有人试图确定最终规范是否有效。发生这种情况是因为没有人对这些课程感到“负责”。将 valarrays 引入 C++ 标准库的人早在标准完成之前就离开了委员会。因此,很少使用 valarrays。

那么,在哪里使用是个好主意std::valarray

0 投票
2 回答
1623 浏览

c++ - 将 valarray 转换为基本数组

我们可以valarray从一个基本的用户定义数组初始化 a,如下所示:

我们怎样才能反过来呢?假设我们有一个valarray<int>并且我们需要转换回一个基本的用户定义数组?我在文档中没有找到任何东西。