在没有循环的情况下重建 n 个 SV 分解矩阵

Rebuild n SV-decomposed matrices without loops

我有一个问题,我需要强制执行 n 个 3x3 矩阵的秩 2,但我不想为其使用循环。 所以我创建了所有矩阵的SVD并将对角矩阵的最小元素设置为0.

import numpy as np
from numpy import linalg as la

[u, s, vT] = la.svd(A)
s[:,2] = 0

因此,当我只有一个矩阵时,我会执行以下操作:

sD = np.diag(s)                 # no idea how to solve this for n matrices
Ar2 = u.dot(sD).dot(vT)         # doing the dot products as two dot products 
                                # using np.einsum for n matrices

好的,所以我在从 (n,3) 数组构建对角矩阵时遇到了问题。我尝试在一些整形后使用 np.diag 但我不认为这个函数可以处理 s 数组的两个维度。循环是一种可能的解决方案,但它太慢了。那么,将我的 s 矩阵构建为对角线形式并分别计算具有给定信息的两个点积的最干净、最快捷的方法是什么?

# dimensions of arrays:
# A -> (n,3,3)
# u -> (n,3,3)
# s -> (n,3)
# vT -> (n,3,3)

如您所料,您可以使用 einsum:

Ar2 = np.einsum('ijk,ik,ikl->ijl', u, s, vT)