我正在从Matlab迁移到C + GSL,我想知道什么是计算矩阵B的最有效方法:
B[i][j] = exp(A[i][j])
Run Code Online (Sandbox Code Playgroud)
其中i在[0,Ny]中,j在[0,Nx]中.
请注意,这与矩阵指数不同:
B = exp(A)
Run Code Online (Sandbox Code Playgroud)
这可以通过GSL(linalg.h)中的一些不稳定/不支持的代码来完成.
我刚刚找到了强力解决方案(几个'for'循环),但有没有更明智的方法呢?
编辑
所有结果都来自1024x1024 for(for)循环,其中在每次迭代double中分配两个值(复数).时间是超过100次执行的平均时间.
gsl_matrix_complex_setGSL提供的功能时224.60 ms (案例3).案例1的源代码:
for(i=0; i<Nx; i++)
{
for(j=0; j<Ny; j++)
{
/* Operations to obtain c_value (including exponentiation) */
matrix[2*(i*s_tda + j)] = GSL_REAL(c_value);
matrix[2*(i*s_tda + j)+1] = GSL_IMAG(c_value);
}
}
Run Code Online (Sandbox Code Playgroud)
案例2的源代码:
for(i=0; i<Nx; i++)
{
for(j=0; j<Ny; j++)
{
/* Operations to …Run Code Online (Sandbox Code Playgroud) 我必须将指数字符串转换6.5235375356299998e-07为浮点值,并将计算结果显示为0.00000065235 ...如何在Python程序中执行此操作?
我正在尝试计算一个向量,其总和为 1,其元素定义如下:
v[i] = exp(tmp[i])/exp(tmp).sum()
Run Code Online (Sandbox Code Playgroud)
问题是指数中的值可能很大(在 -10^2 和 10^2 之间),使得指数计算结果为 inf 或 0。
我尝试了一些变体,例如用分子和分母减去最大元素或 tmp 的平均值,但这仍然不够。
基本上,我需要一种减少 tmp 中平均值和离散度的转换,或者对此计算的巧妙排序。
我使用 numpy 数组作为容器,exp 是 numpy.exp。
我想计算 PHP 中的 EMA(指数移动平均线)值。
我试过下面的代码,但它给了我 500 错误。
$real = array(12,15,17,19,21,25,28,12,15,16);
$timePeriod = 3;
$data = trader_ema($real,$timePeriod);
var_dump($data);
Run Code Online (Sandbox Code Playgroud)
PHP:EMA计算函数trader-ema
尝试了很长时间的谷歌搜索,但在 PHP 中没有得到任何帮助。所以,我不知道需要做什么来计算 EMA 值。
编辑 1:已安装的扩展
我已经安装了所有必要的扩展,现在我得到了输出。但它似乎没有给出适当的输出。
我认为用于计算 EMA 的 PHP 函数无法正常工作。在这方面的任何帮助将不胜感激。
我尝试计算math.exp(9500)但遇到了OverflowError: math range error(大约是 6.3e4125)。从这个问题来看,似乎是由于浮点数太大,接受的答案是“(...) 稍微超出了双精度数的范围,因此会导致溢出”。
我知道Python可以处理任意大的整数(long类型),有没有办法以同样的方式处理任意大的浮点数?
编辑:我最初的问题是关于使用整数来计算 exp(n) 但正如 Eric Duminil 所说,最简单的方法是3**n不提供任何有用的结果。我知道意识到这个问题可能与这个问题类似。
所以,我只是在手动计算eR中的值,我发现有些东西对我来说有点令人不安.
e使用R exp()命令的价值......
exp(1)
#[1] 2.718282
Run Code Online (Sandbox Code Playgroud)
现在,我将尝试使用手动计算它 x = 10000
x <- 10000
y <- (1 + (1 / x)) ^ x
y
#[1] 2.718146
Run Code Online (Sandbox Code Playgroud)
不完全,但我们会尝试更接近使用 x = 100000
x <- 100000
y <- (1 + (1 / x)) ^ x
y
#[1] 2.718268
Run Code Online (Sandbox Code Playgroud)
温暖但有点偏......
x <- 1000000
y <- (1 + (1 / x)) ^ x
y
#[1] 2.71828
Run Code Online (Sandbox Code Playgroud)
现在,让我们尝试一个巨大的
x <- 5000000000000000
y <- (1 + (1 / x)) ^ x
y
#[1] 3.035035 …Run Code Online (Sandbox Code Playgroud) 跑步
x86_64-pc-linux-gnu 上的 PostgreSQL 11.4 (Debian 11.4-1.pgdg90+1),由 gcc 编译 (Debian 6.3.0-18+deb9u1) 6.3.0 20170516,64 位
我尝试过这个声明:
SELECT CAST (2^63-1 as bigint);
Run Code Online (Sandbox Code Playgroud)
但收到意外的错误消息:
bigint 超出范围
奇怪的是,如果我只是用其等效的整数替换指数形式:
SELECT CAST (9223372036854775807 as bigint)
Run Code Online (Sandbox Code Playgroud)
它按预期工作。我想这只是我没有正确理解事情。FWIW我可以使用的指数表示法中的最大数字是这样的:
SELECT CAST (2^63-513 as bigint);
Run Code Online (Sandbox Code Playgroud)
任何更大的东西都会以同样的方式出错。
关于 PostgreSQL 如何求幂,我缺少什么?或者,它是否被转换为浮点数并返回,并且我看到舍入/截断错误?
我想了解$[a**b]在 Bash 中操作最大值的原因。
$ echo $[2**62]
4611686018427387904
$ echo $[2**63]
-9223372036854775808
$ echo $[2**64]
0
Run Code Online (Sandbox Code Playgroud) 我想找到任何整数包含的 2 的幂。像 12 = 2*2*3所以答案应该是2,28 = 2*2*7所以答案应该是2等等。
int powerOf2InNumber = (int)Math.floor(Math.log(number) / Math.log(2));
我尝试了上面的代码,但在 28、26、10 等情况下,我得到了错误的答案。
我想知道具有指数最坏时间复杂度的算法是否应该始终将其声明为 O(2^n)。例如,如果我有一个算法,对于输入大小的每一次增加,它的运算次数为三倍,我会将它的时间复杂度写为 O(3^n),还是仍将其归类为 O(2^n)。
任何正式的解释将不胜感激。
algorithm big-o computer-science time-complexity exponential