【问题标题】:Faster method for dividing two matrices in 8 small matrices将两个矩阵划分为 8 个小矩阵的更快方法
【发布时间】:2018-01-09 07:26:26
【问题描述】:

这是我划分两个矩阵的代码:

def divideM1(X,Y):
  n=len(X)
  a=[[col for col in row[:len(row)/2]] for row in X[:n/2]]
  b=[[col for col in row[len(row)/2:]] for row in X[:n/2]]
  c=[[col for col in row[:len(row)/2]] for row in X[n/2:]]
  d=[[col for col in row[len(row)/2:]] for row in X[n/2:]]
  e=[[col for col in row[:len(row)/2]] for row in Y[:n/2]]
  f=[[col for col in row[len(row)/2:]] for row in Y[:n/2]]
  g=[[col for col in row[:len(row)/2]] for row in Y[n/2:]]
  h=[[col for col in row[len(row)/2:]] for row in Y[n/2:]]

  return a,b,c,d,e,f,g,h

def divideM2(X,Y):
  n=len(X)
  a=[[0 for i in range(n/2)] for j in range(n/2)]
  b=[[0 for i in range(n/2)] for j in range(n/2)]
  c=[[0 for i in range(n/2)] for j in range(n/2)]
  d=[[0 for i in range(n/2)] for j in range(n/2)]
  f=[[0 for i in range(n/2)] for j in range(n/2)]
  e=[[0 for i in range(n/2)] for j in range(n/2)]
  g=[[0 for i in range(n/2)] for j in range(n/2)]
  h=[[0 for i in range(n/2)] for j in range(n/2)]

  for i in range(n/2):
      for j in range(n/2):
        a[i][j]=X[i][j]
        b[i][j]=X[i][j+n/2]
        c[i][j]=X[i+n/2][j]
        d[i][j]=X[i+n/2][j+n/2]
        e[i][j]=Y[i][j]
        f[i][j]=Y[i][j+n/2]
        g[i][j]=Y[i+n/2][j]
        h[i][j]=Y[i+n/2][j+n/2]
  return a,b,c,d,e,f,g,h

如果我使用 time.time(),似乎方法 2-“divideM2”比方法 1 -“divideM1”快,但这是为什么呢? 有没有更好的划分方法?

编辑1: 有趣的是,当我使用 time.time() 时:

start = time.time()
print("method1")
for i in range(10000):
  1>2
divideM2(a1,a1)
end = time.time()
t1=end-start
print t1 ,"m1"

start = time.time()
print("method2")
for j in range(10000):
  1>2
divideM1(a2,a2)
end = time.time()
t2= end-start
print t2, "m2"

if t1>t2:
  print "method 2 is faster"
else:
  print "method 1 is faster"

即使我自己比较“divide1”,我总是得到“方法 2 更快”。有人也可以解释一下吗?

【问题讨论】:

  • 我的两个问题是:1)为什么divide2比divide1快? 2)有没有更好的方法?
  • 这需要NumPy
  • 为什么要重复第二个矩阵的代码?您可以将一个矩阵分成 4 个矩阵,然后调用该方法两次。

标签: python algorithm performance matrix matrix-multiplication


【解决方案1】:

我认为方法 2 更快,因为您只使用了 2 个循环,而不是您在第一种方法中使用的所有 for 循环。

关于其他方式,你可以试试numpy.split。这是doc

【讨论】:

  • 但是我也在方法2中使用了多个for循环来初始化多个子数组
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
相关资源
最近更新 更多