如果你将 k 解开为 m^2 向量并展开 X,你会得到:
-
m**2 向量k
-
((n-m)**2, m**2) 矩阵unrolled_X
其中unrolled_X可以通过以下Python代码获得:
from numpy import zeros
def unroll_matrix(X, m):
flat_X = X.flatten()
n = X.shape[0]
unrolled_X = zeros(((n - m) ** 2, m**2))
skipped = 0
for i in range(n ** 2):
if (i % n) < n - m and ((i / n) % n) < n - m:
for j in range(m):
for l in range(m):
unrolled_X[i - skipped, j * m + l] = flat_X[i + j * n + l]
else:
skipped += 1
return unrolled_X
展开 X 而不是 k 可以让每个 X 比其他方式更紧凑的表示(更小的矩阵) - 但您需要展开每个 X。您可能更喜欢展开 k,具体取决于您想要做什么。
在这里,unrolled_X 不是稀疏的,而 unrolled_k 会是稀疏的,但 @Salvador Dali 提到的大小为 ((n-m+1)^2,n^2)。
展开k 可以这样完成:
from scipy.sparse import lil_matrix
from numpy import zeros
import scipy
def unroll_kernel(kernel, n, sparse=True):
m = kernel.shape[0]
if sparse:
unrolled_K = lil_matrix(((n - m)**2, n**2))
else:
unrolled_K = zeros(((n - m)**2, n**2))
skipped = 0
for i in range(n ** 2):
if (i % n) < n - m and((i / n) % n) < n - m:
for j in range(m):
for l in range(m):
unrolled_K[i - skipped, i + j * n + l] = kernel[j, l]
else:
skipped += 1
return unrolled_K