矩阵与函数的矩阵运算

时间:2019-06-26 13:47:52

标签: performance function matrix

由于找不到关于此主题的任何内容,因此我决定在这里提出此问题。我完全是新手,这个问题可能很荒谬。

假设我们有A(NxN)矩阵和列向量(B(Nx1))。我们还有一个函数f(i,j),该函数返回行A和列i处的矩阵j的元素。

如果我们要进行一些矩阵运算,例如AB的矩阵乘积,则可以使用:以下内容(下面的C是矩阵积的结果) :

  1. 使用功能f(i,j)
N = 100000


def f(i, j):
    return i + j


for i in range(N):
    for j in range(N):
        s = 0
        for k in range(N):
            s += f(i, k) * B[k]
        C[i] = s
  1. 使用矩阵A(NxN)(假设A已经定义并且包含由函数f返回的相同元素)
N = 100000
for i in range(N):
     for j in range(N):
        s = 0
        for k in range(N):
            s += A[i,k]*B[k]
        C[i] = s

我认为,该函数的优点是它避免存储矩阵的所有值,从而节省了内存。

我的问题是:

  • 在这种情况下,这是进行矩阵乘法(使用函数或矩阵本身)的最有效方法?

  • 两种方法之间是否存在性能差异?

编辑:我的问题并不特定于Python或任何其他特定语言。

2 个答案:

答案 0 :(得分:2)

老实说,这没有正确答案,因为这取决于您愿意牺牲的内容以及所使用的语言。 无论如何,主要区别是函数方法将比矩阵方法花费更多的时间,而矩阵方法将花费更多的空间(显然吗?)。

使用时间来节省内存通常不是一个好主意,因为我们拥有足够的内存并且时间更少。

我在python中用 N = 10并得到Function 0.015623331069946289, Matrix 0.0

N = 100并得到Function 1.0839078426361084, Matrix 0.8769278526306152

〜当前运行N = 1000〜

任何更大的东西,我都必须切换到Numpy。

如果有人想尝试一下,这是我用来计时的代码。

import time
n = 1000
def f(i, j):
  return i+j

A = [[i+j  for j in range(n)] for i in range(n)]
B = [i for i in range(n)]
C = [0 for _ in range(n)]

start1 = time.time()
for i in range(n):
  for j in range(n):
    s = 0
    for k in range(n):
      s += f(i, k) * B[k]
    C[i] = s
end1 = time.time()

start2 = time.time()
for i in range(n):
  for j in range(n):
    s = 0
    for k in range(n):
      s += A[i][k]*B[k]
    C[i] = s
end2 = time.time()


print("Function-", end1-start1, ", Matrix-", end2-start2)

当然,如您的问题所述,此方法假定已经建立矩阵,因为这样做也需要大量时间。

编辑:以N = 1000运行,获得了Function 620.2477366924286, Matrix 478.4342918395996

如您所见,矩阵方法越大,收到的时间越长

答案 1 :(得分:1)

  1. 在遇到性能问题之前,您不应该关心性能问题。在99.99%的情况下-任何方法都对您有效。首先,代码应该是可读的,然后是性能About premature optimization

  2. 在您的具体示例中-具有函数的代码应该更慢(仅是由于附加的函数调用)或可能具有相同的性能(如果编译器将其内联)。顺便说一句-参见#1-首先您应该不在乎并编写可读代码

  3. 如果您确实需要高性能的代码-可以使用大量的库(例如NumPy)。图书馆通常会更快地工作。有些方法甚至可以delegate calculation to the GPU

另请参见matrix multiplication performance