问题标签 [numerical-computing]
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.
haskell - 跨 FFI 和惰性的可变数据
介绍
我用inline-c
;包装了一个 C 数值库 一些函数可以通过回调传递给步骤例程,考虑 ODE 的优化或时间集成。
特别是在原生 C 语言中,回调可以对连续数组进行操作,通过指针修改它们,并将它们返回到一些不透明(分布式)数据结构。
所以这是一个可变数据问题,我想在 Haskell 方面表示它:根据我的理解,在回调中我们应该冻结数组,处理它,例如作为 aData.Vector.Storable.Vector
或 with repa
,解冻结果,获取外部指针并将其传回。
internals:newtype Vec = Vec (Ptr Vec) deriving Storable
和 Context 中的相关条目inline-c
分别表示指向不透明 C 数据结构的指针的类型和vecGetArray
/vecRestoreArray
生成/请求指向连续内存的相同指针和请求/生成 a Vec
。
问:
我注意到,虽然返回Vector
是正确的,但当我使用修改后的结果Vec
(“副作用”)时,从这个函数返回后,它没有被修改。GHC 不会重新计算它(懒惰?)。我如何让它重新计算它?Haskell 中有什么惯用的方式来处理跨 FFI 的可变数据?
* 固定的 *
看答案
谢谢!
vec.hs:
内联C.hs
此外,IIUC 的代码制作了 2 个额外的向量副本,一份在冻结时,一份在解冻时。,但我怀疑它效率低下。有人可以提出改进或简化的建议吗?
c - MATLAB 的 LAPACK 调用的实现是否比直接调用更有效?
我正在尝试制作我在 MATLAB 中拥有的许多东西的 C 版本,并且我使用 matlab 的 eig 与 dsyev 调用对特征值分解进行计时,而 MATLAB 的速度更快。例如:
10 x 10:eig 为 0.003246 秒,C 中 dsyev 为 0.013897 秒
100 x 100:eig 为 0.001516 秒,C 中 dsyev 为 0.001764 秒
1000 x 1000:eig 为 0.304438 秒,C 中 dsyev 为 0.356483 秒
我的印象是 MATLAB 只使用 LAPACK 调用这种低级的东西。图片还有更多内容吗?
谢谢!
c++ - 如何在c ++中对double或float的尾数和指数部分进行操作(快速)?
我使用 c++ 来计算各种类型的特殊函数(例如 Lambert 函数、求值反转的迭代方法等)。在许多情况下,直接使用尾数和指数显然有更好的方法。
我找到了很多如何提取尾数和指数部分的答案,但是所有这些都只是“计算速度不是很有效的学术案例”,对我来说有点无用(我使用尾数和指数操作的动机是改进计算速度)。有时我需要调用一些特定的函数大约十亿次(非常昂贵的计算),所以每次保存的计算工作都很好。并且使用将尾数作为双精度返回的“freexp”不是很合适。
我的问题是(对于具有 IEEE 754 浮点的 c++ 编译器):
1)如何读取浮点/双精度尾数的特定位?
2)如何将整个尾数读入浮点/双精度的整数/字节?
3) 与 1)、2) 相同的问题。
4) 写作题与 1)、2)、3) 相同。
如果我直接使用尾数或指数,我的动机是更快的计算。我想必须有一个非常简单的解决方案。
math - 求解一阶复 ODE
我有一个关于求解一阶复微分方程的问题。我使用了 Runge-Kutta,但答案似乎并不正确。
这是我的等式:
ODE 的结果还可以,但对于复杂的方程,它似乎不正确。
我用 gfortran 编译了我的代码,并用 gnuplot 为没有i
. 该图对于方程的解是正确的。但我i
在我的等式中添加了图表,图表只是一条直线。此外,gnuplot 只是绘制真实的部分。
代码编译时没有任何编译时错误。
这是我的代码:
和输出:
python - python数值错误:大数加小数
这是 Udacity 深度学习课程中的一个练习。
谁能解释为什么最终答案不是 1.0?
c++ - 为性能库制作高效包装器的智能方法
假设我们有一个外部库,它可以在一个双精度浮点数数组上非常快速地进行计算(大多数时候是多线程的)。为方便起见,我以面向对象的方式编写代码,以便获得一组对象。每个对象都有一个持有双精度值的属性。使用强大的外部库的天真的方法是这样的:
但是,这需要时间和额外的内存来保存临时数组。有没有更好的方法来做到这一点?
这是一个普遍的问题,但我基本上想在 C++ 中解决这个问题。
python - 在python中计算正常样本落在某个间隔内的概率的日志时防止下溢
给定两个实数x
和y
,我想在 python 中计算以下函数:
其中t
是从正态分布中采样的。
一种天真的实现是使用scipy.stats.norm
.
不幸的是,这会在x
和y
远离时导致下溢0
。如何防止这样的数字错误?
matlab - 我无法确定具有最低等级的多项式插值
我必须用以下来限制它:P(-1) = f(-1), P(0)=f(0), P(1)=f(1), P'(1)=f'( 1)
c++ - 数值误差是否可重现?
也许这是一个愚蠢的问题,但直到我最近才被迫这样做,我才想到它。
假设一个程序以完全相同的状态初始化,并且没有未初始化变量的未定义行为。CPU 上的寄存器状态在代码执行之前可能会有所不同。假设没有外部现象导致异常位翻转。
相同的数值计算序列是否总是产生相同的结果(如双精度和浮点数的整个位表示)?换句话说,数值误差是确定性的吗?
编辑:我知道指针地址每次都可能不同,但让我们抽象指针地址,以免在任何计算中使用。
matrix - 如何在 fortran 函数中输出 2 个或更多数组?
我正在编写一个计算矩阵的 LU 分解的程序,具有部分旋转,我希望该函数输出几个(2 或 3)个矩阵,而不需要多次运行程序来单独输出每个矩阵,这是浪费时间,因为它让我一次获得我想要的一切。有没有办法做到这一点?例如,这是我使用 Doolittle 算法的函数,用于不需要旋转的方阵。我希望我的输出同时成为矩阵 l 和 u,但我不知道这样做的方法。