4d矩阵与2d矩阵相互映射关系,svd降维时候用到。
import cupy as cp
d4 = cp.linspace(1, 1000, 1000).reshape(10, 4, 5, 5) # [N,C,d,d]
def four_2_two(d4):
N, C, d, _ = d4.shape
d2 = cp.empty([d * N, d * C])
def innrt(i1, i2, i3, i4, d):
j1 = (i1 - 1) * d + i3
j2 = (i2 - 1) * d + i4
return j1, j2
for i1 in range(N):
for i2 in range(C):
for i3 in range(d):
for i4 in range(d):
j1, j2 = innrt(i1, i2, i3, i4, d)
d2[j1, j2] = d4[i1, i2, i3, i4]
return d2
re_d2 =four_2_two(d4)
print(len(cp.unique(re_d2)))
def two_2_four(d2):
h,w = d2.shape
N, C, d, _ = (10, 4, 5, 5)
d4 = cp.empty((10, 4, 5, 5))
def innrt(i1, i2, i3, i4, d):
j1 = (i1 - 1) * d + i3
j2 = (i2 - 1) * d + i4
return j1, j2
for i1 in range(N):
for i2 in range(C):
for i3 in range(d):
for i4 in range(d):
j1, j2 = innrt(i1, i2, i3, i4, d)
d4[i1, i2, i3, i4] = d2[j1, j2]
return d4
re_d4= two_2_four(re_d2)
print(len(cp.unique(re_d4)))