更新#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)
即。假设我要删除#-----------中的所有内容并执行以下操作:
f = lambda x: x**2
for i in range(len(some_list)):
#evaluate algorithm
if condition 1:
f = lambda x: f(x) + 1
elif condition 2:
f = lambda x: f(x) + 2
else:
f = lambda x: f(x) + 3
for pt in x:
f(pt)
事实上,由于你要覆盖以前的f lambda函数,所以无法完成。总的来说,我试图减少实际上重新f的次数。我想只找到一次,但多次评估它。 我可以破解它做这样的事情:
f = lambda x: x**2
temp = []
for i in range(len(some_list)):
#evaluate algorithm
if condition 1:
temp.append(lambda x = f(x) + 1)
elif condition 2:
temp.append(lambda x = f(x) + 2)
else:
temp.append(lambda x = f(x) + 3)
new_f = lambda x: sum([func(x) for func in temp])
for pt in x:
new_f(pt)
我希望以前有人试图这样做过。
我想为矩阵生成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
答案 0 :(得分:2)
修改2
所以你从
开始F0(x) = x^2 # or whatever you want
你希望得到Fn
Fn(x) = Fn-1(x) + kn
在这种情况下,很简单,例如,如果你想要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
答案 1 :(得分:2)
您可以使用列表(或NumPy库)列表或嵌套列表。但是,这是实现动态嵌套列表(A矩阵)的示例代码。
设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;
答案 2 :(得分:0)
根据您的示例:
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