迭代更新Lambda函数

2024-04-26 02:15:32 发布

您现在位置:Python中文网/ 问答频道 /正文

更新#2:先阅读下面的内容!

-------------------------在

(特别感谢大家至今对我的忍耐)

让我试着让它简单些。如果我事先知道计算函数f的算法,但不知道它的最终结果,我如何在每次都不重做算法的情况下对多个函数进行计算?在

f = lambda x: x**2
for pt in x:
#-----------
    for i in range(len(some_list)):
        #evaluate algorithm
        if condition 1:
            f = f + 1
        elif condition 2:
            f = f + 2
        else:
            f = f + 3
#-----------
    f(pt)

也就是说,我要删除#----------中的所有内容,然后执行以下操作:

^{pr2}$

实际上,这是不可能的,因为您将重写前面的f lambda函数。总的来说,我正在努力减少重复查找f的次数。我只想找到它一次,但要对它进行多次求值。 我可以把它破解成这样:

^{3}$

-------------------------在

我希望这里有人曾经试过这么做。在

我想为一个矩阵生成一个lambda函数,但是我不知道这个矩阵是先验的,我通过循环迭代来构建它。其思想是矩阵中的每个元素都依赖于邻近的原子,在伪码中:

Matrix = zeros((N,N))
for i in atoms:
    Matrix.update

现在问题来了,我有一堆向量,比如x有3列,M行。我想为x中的每一行计算这个矩阵。我可以执行以下操作:

for pt in x:
    Matrix = zeros((N,N))
    for i in atoms:
        Matrix.update(@x)

但是,如果我可以简单地生成矩阵的lambda函数,这样就不必每次都重建矩阵,那么计算效率会更高。就像:

Matrix = zeros((N,N))
for i in atoms
    l_Matrix = lambda x: Matrix + l_Matrix
l_Matrix(x)

使用python似乎很难做到这一点。不幸的是,不能在python中递归地添加lambda函数,因为它会删除前一个实例的内存,从而导致递归中断。在

解决这个问题的唯一方法是列出一个列表,在这个列表中,我将附加lambda函数,然后在最后将它们相加,得到最后的矩阵lambda函数。有人知道更清洁的方法吗?在

谢谢你!在

更新:一个例子。在

for pt in x:
    Matrix = zeros((N,N))
    for i in atoms:
        #a bunch of if statements to determine what I do to the matrix element
        Matrix[i,i] = exp(2*pi*1.0j*sum(pt)) #for example

理想情况下,我不想每次都生成矩阵,我想知道x点的矩阵,我更希望找到它,然后计算它。在

我有很多兴趣,我基本上在研究原子的紧束缚哈密顿量,它们有助于确定化合物或合金的电子结构。请参阅以获取一个简单但详细的示例:http://cacs.usc.edu/education/phys516/04TB.pdf


Tags: lambda函数in算法pt内容forif
3条回答

您可以使用列表列表(或NumPy库)或嵌套列表。但是,这是实现动态嵌套列表(矩阵)的示例代码。在

设M为行数:

 M=3
 X=[]
 Matrix=(x, M)
 for i in range(M):
     X.append([int(z) for z in atoms().split()])
     for i in M: //adding column:
        i.append(z)
        if (Matrix.reverse()): // Whenever you get the last element of your desired list
          Matrix[0]
          break;

根据您的例子:

Matrix = zeros((N,N)) 
for pt in x:
    v = exp(2*pi*1.0j*sum(pt))  # because it does not use i
    for i in atoms:
        #a bunch more of potential if statements to determine Matrix
        Matrix[i,i] = v

编辑2

所以你从

F0(x) = x^2 # or whatever you want

你想让Fn这样

^{pr2}$

在这个例子中很简单,例如如果你想要F3

F0(x) = x^2
F1(x) = F0(x) + k1
F2(x) = F1(x) + k2
F3(x) = F2(x) + k3

那么

F3(x) = F2(x) + k3
      = (F1(x) + k2) + k3  
      = F1(x) + (k2 + k3) 
      = (F0(x) + k1) + (k2 + k3) 
      = F0(x) + (k1 + k2 + k3)  

从这里可以推断出

Fn(x) = F0(x) + sum( ki )

在代码中

k = 0
for i in range(len(some_list)):
    #evaluate algorithm
    if condition 1:
        k += 1
    elif condition 2:
        k += 2
    else:
        k += 3

func = lambda x: x**2 + k

相关问题 更多 >