我在MATLAB中有很重要的功能:
function [out] = f ( in1, in2, in3)
Run Code Online (Sandbox Code Playgroud)
使用相同的参数经常调用它.该函数是确定性的,因此对于给定的输入参数,其输出将始终相同.
在函数中存储计算输入结果的最简单方法是什么,如果使用相同的输出再次调用该函数,它将能够快速回答?
是一个持久变量,它将(使用containers.Map或其他类)输入集映射<in1, in2, in3>到结果的方式去?
请注意,在我的应用程序中,任何需要将数据保存到磁盘的方法都是不可能的.
假设我有一些带有内部类的类:
class A:
   class B:
      ...
   ...
Run Code Online (Sandbox Code Playgroud)
我想在与 classB代码不同的文件中实现 classA以提高可读性。
如何做到这一点?
编辑:B除了A.B.
我想从有界域中的"zipf"分发中进行抽样.
也就是说,假设域是{1,...,N},我想要选择域中的每个元素i,其概率与其成比例i ** -a,其中a是分布的参数.
numpy 提供了一个zipf采样器(numpy.random.zipf),但它不允许我限制域.
我怎样才能从这种分布中轻松抽样?
如果分布参数,, a大于1,我可以numpy通过拒绝(并重新采样)所有大于的样本来使用采样器N.但是,由于它不限制样本范围,因此尝试使用任何较小的值a都不起作用.
当域是有限的时,使用这样的as 应该没有问题,这就是我的应用程序所需要的.
我想要计算类似的东西:

哪个f(i)函数返回[-1,1]任何iin中的实数{1,2,...,5000}.
显然,总和的结果在某处[-1,1],但是当我似乎无法使用直接编码在Python中计算它时,变为和变为,这导致计算的总和变成.0.550000comb(5000,2000)infNaN
所需的解决方案是使用双面登录.
这是使用身份,如果我可以计算,我可以计算总和,即使很大,几乎.a × b = 2log(a) + log(b)log(a)log(b)ab0
所以我想我要问的是,如果有一种简单的计算方法
log2(scipy.misc.comb(5000,2000))
Run Code Online (Sandbox Code Playgroud)
所以我可以简单地计算我的总和
sum([2**(log2comb(5000,i)-5000) * f(i) for i in range(1,5000) ])
Run Code Online (Sandbox Code Playgroud)
@ abarnert的解决方案,同时为5000图工作,通过提高计算梳子的精度来解决问题.这适用于此示例,但不会扩展,因为如果不是5000而我们需要1e7,所需的内存将显着增加.
目前,我正在使用一种丑陋的解决方法,但保持低内存消耗:
log2(comb(5000,2000)) = sum([log2 (x) for x in 1:5000])-sum([log2 (x) for x in 1:2000])-sum([log2 (x) for x in 1:3000])
Run Code Online (Sandbox Code Playgroud)
有没有办法在可读的表达式中这样做?
我有以下程序(koko.c):
#include <stdio.h>
int main(){
    double p = 0.1;
    printf("%lf, %d\n", 1/p, 1/p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用它来编译它gcc koko.c -o koko我得到错误:
koko.c:4:2:警告:格式'%d'需要类型为'int'的参数,但参数3的类型为'double'[-Wformat =] printf("%lf,%d \n",1/p,(int)1/p);
如果我尝试禁用Wformat(即gcc koko.c -Wformat=0 -o koko),它会编译,但是当我运行它时,我会得到意想不到的输出:
 10.000000, -915298312.
有没有想过为什么会这样?
python ×3
c ×1
caching ×1
class ×1
distribution ×1
gcc ×1
large-data ×1
matlab ×1
module ×1
probability ×1
sampling ×1
scipy ×1