Describe what you are looking for
Summary
NumKong has dot(a, b) for vectors and for matrix–vector (e.g. A (n, d) @ b (d,) → (n,)), and dots_pack / dots_packed for the GEMM-style case where one side is pre-packed and we compute A @ B.T. There is no direct general matrix multiplication for two 2D arrays: A (m, k) @ B (k, n) → (m, n), i.e. a single API equivalent to NumPy’s np.matmul / @ or OpenCV’s cv2.gemm.
Analogous API: OpenCV cv2.gemm
OpenCV provides cv2.gemm: generalized matrix multiply alpha * A * B + beta * C. With alpha=1, beta=0, and C=None, this is standard matrix multiply A @ B. It accepts 2D matrices and returns 2D. We use it in an image-augmentation codebase for both small matrices and for operations that involve image-sized data (see below).
How we use it today
1. Small matrices (direct cv2.gemm)
- Thin Plate Spline (TPS): Pairwise distances
cv2.gemm(points1, points2.T, 1, None, 0) → (N, 2) @ (2, M) → (N, M); transform: cv2.gemm(kernel_matrix, nonlinear_weights, 1, None, 0) and cv2.gemm(affine_terms, affine_weights, 1, None, 0) (small matrices).
- Stain normalization (Macenko):
cv2.gemm(angle_to_vector, principal_eigenvectors_t, 1, None, 0) — (2, 2) @ (2, 3) → (2, 3).
So we need general matmul for small 2D × 2D matrices, same semantics as cv2.gemm(A, B, 1, None, 0).
2. "Image × small matrix" (NumPy @ today)
In stain normalization we have optical_density shape (num_pixels, 3) (flattened image) and small matrices like stain_colors (3, 2). We do e.g. optical_density @ stain_colors.T → (num_pixels, 2). So the first operand can be image-sized, the second small — still general matmul A @ B, not element-wise image multiply.
Request
Provide a general matrix multiplication API that: (1) accepts two 2D arrays A (m, k) and B (k, n), (2) returns C (m, n) = A @ B, (3) works for both small×small and large×small. Either a dedicated matmul(A, B) (or gemm(A, B, alpha, C, beta)) or generalize dot so that when both arguments are 2D with compatible shapes it performs full matmul instead of "Vector dimensions don't match".
Why not only dots_packed?
dots_packed(A, dots_pack(B)) gives A @ B.T. To get A @ B we have to pack B.T and call dots_packed(A, dots_pack(B.T)), which is awkward. A direct matmul(A, B) would match NumPy/OpenCV usage and our existing cv2.gemm and optical_density @ stain_matrix patterns.
Can you contribute to the implementation?
Is your feature request specific to a certain interface?
It applies to everything
Contact Details
No response
Is there an existing issue for this?
Code of Conduct
Describe what you are looking for
Summary
NumKong has
dot(a, b)for vectors and for matrix–vector (e.g.A(n, d) @b(d,) → (n,)), anddots_pack/dots_packedfor the GEMM-style case where one side is pre-packed and we computeA @ B.T. There is no direct general matrix multiplication for two 2D arrays:A(m, k) @B(k, n) → (m, n), i.e. a single API equivalent to NumPy’snp.matmul/@or OpenCV’scv2.gemm.Analogous API: OpenCV
cv2.gemmOpenCV provides cv2.gemm: generalized matrix multiply
alpha * A * B + beta * C. Withalpha=1,beta=0, andC=None, this is standard matrix multiplyA @ B. It accepts 2D matrices and returns 2D. We use it in an image-augmentation codebase for both small matrices and for operations that involve image-sized data (see below).How we use it today
1. Small matrices (direct
cv2.gemm)cv2.gemm(points1, points2.T, 1, None, 0)→ (N, 2) @ (2, M) → (N, M); transform:cv2.gemm(kernel_matrix, nonlinear_weights, 1, None, 0)andcv2.gemm(affine_terms, affine_weights, 1, None, 0)(small matrices).cv2.gemm(angle_to_vector, principal_eigenvectors_t, 1, None, 0)— (2, 2) @ (2, 3) → (2, 3).So we need general matmul for small 2D × 2D matrices, same semantics as
cv2.gemm(A, B, 1, None, 0).2. "Image × small matrix" (NumPy
@today)In stain normalization we have
optical_densityshape (num_pixels, 3) (flattened image) and small matrices likestain_colors(3, 2). We do e.g.optical_density @ stain_colors.T→ (num_pixels, 2). So the first operand can be image-sized, the second small — still general matmulA @ B, not element-wise image multiply.Request
Provide a general matrix multiplication API that: (1) accepts two 2D arrays
A(m, k) andB(k, n), (2) returnsC(m, n) =A @ B, (3) works for both small×small and large×small. Either a dedicatedmatmul(A, B)(orgemm(A, B, alpha, C, beta)) or generalizedotso that when both arguments are 2D with compatible shapes it performs full matmul instead of "Vector dimensions don't match".Why not only
dots_packed?dots_packed(A, dots_pack(B))givesA @ B.T. To getA @ Bwe have to packB.Tand calldots_packed(A, dots_pack(B.T)), which is awkward. A directmatmul(A, B)would match NumPy/OpenCV usage and our existingcv2.gemmandoptical_density @ stain_matrixpatterns.Can you contribute to the implementation?
Is your feature request specific to a certain interface?
It applies to everything
Contact Details
No response
Is there an existing issue for this?
Code of Conduct