【发布时间】:2018-09-21 20:26:09
【问题描述】:
我需要将以下函数应用于二维矩阵中的每个单元格。我的矩阵最多可以有 100 万个单元格。计算这个更快的方法是什么? 函数如下:
def walkRight(r,c,walls):
global Pwalk
global rows
global columns
sum = 0
if c == (columns-1) or [r,c+1] in walls:
sum = sum + Pwalk * U[r][c]
else:
sum = sum + Pwalk * U[r][c+1]
if r == 0 or [r-1,c] in walls:
sum = sum + 0.5*(1-Pwalk) * U[r][c]
else:
sum = sum + 0.5*(1-Pwalk) * U[r-1][c]
if r == rows-1 or [r+1,c] in walls:
sum = sum + 0.5*(1-Pwalk) * U[r][c]
else:
sum = sum + 0.5*(1-Pwalk) * U[r+1][c]
return sum
【问题讨论】:
-
如果您真的需要将此函数应用于每个单元格,那么我相信除了迭代 O(n*n) 的所有内容之外别无选择。
-
或者,如何修改函数,使其可以应用于每个单元格?
-
如果您将函数应用于每个单元格,则需要调用它 r * c 次,这将导致 O(n*n) 无论函数的定义方式如何。您可以做的是考虑是否有不需要应用此功能的单元格,然后想办法只查找您需要的单元格。但是要获得这方面的帮助,您需要展示更多代码或解释您的程序的功能,以便人们知道您在使用
sum做什么。 -
尝试提出一个适用于元素块的计算,例如
U[1:,:]或U[:-1, 1:]。 -
我认为,那行不通。我正在尝试解决一个迷宫,因此,对于每个单元格,我都在尝试使用值迭代找到最佳移动。对于值迭代,我需要为每个单元格找到 Utility。对于每个单元格,我有 4 个动作:向左移动、向右移动、向上移动和向下移动。上面的代码只是展示了一个这样的功能。但在实际问题中,我的效用将是每个动作的最大值。因此,对于每个单元格,我将必须应用 4 个这样的函数,如上所示,矩阵的一个这样的计算将是单次迭代。我需要再次迭代新矩阵。重复此过程。
标签: python python-2.7 numpy