问题标签 [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.

0 投票
1 回答
176 浏览

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 个额外的向量副本,一份在冻结时,一份在解冻时。,但我怀疑它效率低下。有人可以提出改进或简化的建议吗?

0 投票
0 回答
142 浏览

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 调用这种低级的东西。图片还有更多内容吗?

谢谢!

0 投票
3 回答
1403 浏览

c++ - 如何在c ++中对double或float的尾数和指数部分进行操作(快速)?

我使用 c++ 来计算各种类型的特殊函数(例如 Lambert 函数、求值反转的迭代方法等)。在许多情况下,直接使用尾数和指数显然有更好的方法。

我找到了很多如何提取尾数和指数部分的答案,但是所有这些都只是“计算速度不是很有效的学术案例”,对我来说有点无用(我使用尾数和指数操作的动机是改进计算速度)。有时我需要调用一些特定的函数大约十亿次(非常昂贵的计算),所以每次保存的计算工作都很好。并且使用将尾数作为双精度返回的“freexp”不是很合适。

我的问题是(对于具有 IEEE 754 浮点的 c++ 编译器):

1)如何读取浮点/双精度尾数的特定位?

2)如何将整个尾数读入浮点/双精度的整数/字节?

3) 与 1)、2) 相同的问题。

4) 写作题与 1)、2)、3) 相同。

如果我直接使用尾数或指数,我的动机是更快的计算。我想必须有一个非常简单的解决方案。

0 投票
1 回答
204 浏览

math - 求解一阶复 ODE

我有一个关于求解一阶复微分方程的问题。我使用了 Runge-Kutta,但答案似乎并不正确。

这是我的等式:

ODE 的结果还可以,但对于复杂的方程,它似乎不正确。

我用 gfortran 编译了我的代码,并用 gnuplot 为没有i. 该图对于方程的解是正确的。但我i在我的等式中添加了图表,图表只是一条直线。此外,gnuplot 只是绘制真实的部分。

代码编译时没有任何编译时错误。

这是我的代码:

和输出:

0 投票
2 回答
952 浏览

python - python数值错误:大数加小数

这是 Udacity 深度学习课程中的一个练习。

谁能解释为什么最终答案不是 1.0?

0 投票
2 回答
73 浏览

c++ - 为性能库制作高效包装器的智能方法

假设我们有一个外部库,它可以在一个双精度浮点数数组上非常快速地进行计算(大多数时候是多线程的)。为方便起见,我以面向对象的方式编写代码,以便获得一组对象。每个对象都有一个持有双精度值的属性。使用强大的外部库的天真的方法是这样的:

但是,这需要时间和额外的内存来保存临时数组。有没有更好的方法来做到这一点?

这是一个普遍的问题,但我基本上想在 C++ 中解决这个问题。

0 投票
1 回答
433 浏览

python - 在python中计算正常样本落在某个间隔内的概率的日志时防止下溢

给定两个实数xy,我想在 python 中计算以下函数:

其中t是从正态分布中采样的。

一种天真的实现是使用scipy.stats.norm.

不幸的是,这会在xy远离时导致下溢0。如何防止这样的数字错误?

0 投票
1 回答
37 浏览

matlab - 我无法确定具有最低等级的多项式插值

我必须用以下来限制它:P(-1) = f(-1), P(0)=f(0), P(1)=f(1), P'(1)=f'( 1)

0 投票
1 回答
92 浏览

c++ - 数值误差是否可重现?

也许这是一个愚蠢的问题,但直到我最近才被迫这样做,我才想到它。

假设一个程序以完全相同的状态初始化,并且没有未初始化变量的未定义行为。CPU 上的寄存器状态在代码执行之前可能会有所不同。假设没有外部现象导致异常位翻转。

相同的数值计算序列是否总是产生相同的结果(如双精度和浮点数的整个位表示)?换句话说,数值误差是确定性的吗?

编辑:我知道指针地址每次都可能不同,但让我们抽象指针地址,以免在任何计算中使用。

0 投票
1 回答
526 浏览

matrix - 如何在 fortran 函数中输出 2 个或更多数组?

我正在编写一个计算矩阵的 LU 分解的程序,具有部分旋转,我希望该函数输出几个(2 或 3)个矩阵,而不需要多次运行程序来单独输出每个矩阵,这是浪费时间,因为它让我一次获得我想要的一切。有没有办法做到这一点?例如,这是我使用 Doolittle 算法的函数,用于不需要旋转的方阵。我希望我的输出同时成为矩阵 l 和 u,但我不知道这样做的方法。