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

时间:2018-02-20 18:25:05

标签: python-3.x numpy matrix multidimensional-array svd

我遇到的问题是我需要强制执行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-array的两个维度。循环可能是一种解决方案,但速度太慢。那么,使用给定信息分别计算两个点积的最简洁,最快捷的方法是将s-matrices构建成对角线形式?

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

1 个答案:

答案 0 :(得分:1)

如您所料,您可以使用einsum

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