我有两个稀疏矩阵 A 和 B,其中 A 和 B 具有相同的列数(但行数可能不同)。我正在尝试获得一个稀疏矩阵 C,其元素为 c_ij = sum_j min(a_ij,b_ji),其中 a_ij 和 b_ij 分别是 A 和 B 的元素。
这可以有效地完成吗?理想情况下是稀疏的吗?即使密集也可以,但涉及的矩阵将是巨大的(数万行)并且非常稀疏。
详情: 类比是标准(数学)矩阵乘法,但我不想对元素的乘积求和,而是对元素的最小值求和。
一个例子会有所帮助。使用标准矩阵乘法 A * B^T 给出元素 c_ij = sum_j a_ij * b_ji for elements a_ij in A and b_ij in B with i and j as row and column indices, respectively.
例如,
import numpy as np
from scipy.sparse import csr_matrix
A = csr_matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]])
B = csr_matrix([[2, 0, 0], [0, 0, 3], [6, 0, 0]])
BT = B.transpose()
C= A * BT
print(f"\nC = A * B^T = \n{C}")
给予
>>>
C = A * B^T =
(0, 2) 6
(0, 0) 2
(1, 1) 9
(2, 1) 15
(2, 2) 24
(2, 0) 8
在哪里
c_33 = 24 = sum_j ( a_3j * b_j3 ) = 4 * 6 + 0 * 0 + 5 * 0.
我想要最小值的总和,而不是乘积 a_ij * b_ji 的总和:
c_33 = sum_j min(a_ij,b_ji) = min(4,6) + min(0,0) + min(0,5) = 4.
在普通的密集数组中,使用三维数组可以更轻松地完成此操作,但稀疏形式不可用。相反,
import scipy.sparse
from scipy.sparse import csr_matrix
A = csr_matrix([
[1, 2, 7],
[5, 0, 3],
[4, 0, 5],
])
B = csr_matrix([
[2, 7, 0],
[4, 0, 3],
[6, 0, 0],
])
ABT = scipy.sparse.vstack((
A.reshape((1, -1)),
B.T.reshape((1, -1))
))
mins = ABT.min(axis=0).reshape(A.shape)
C = mins.sum(axis=1)
print("C = Σ(min(A, B^T)) =")
print(C)
C = Σ(min(A, B^T) =
[[9]
[5]
[0]]