【问题标题】:Multiplying matrixes of different dimensions in Python在Python中乘以不同维度的矩阵
【发布时间】:2021-11-24 03:50:44
【问题描述】:

我需要在 Python 中使用单值分解来反转以下矩阵,并且我需要将这些矩阵相乘以获得初始矩阵以进行确认。当矩阵有不同的维度时,我该怎么做?

   X_b= [[array([2.52390408]), array([2.4962137]), array([2.46467486]), array([2.48760957])], [array([2.52390408]), array([2.4962137]), array([2.46467486]), array([2.48760957])]]

我使用了命令

svd=linalg.svd(x_b, full_matrices=True, compute_uv=True, hermitian=False)

结果是

a=svd[0]

a =[[ 0.50615947 -0.50060626 -0.49428127 -0.49888074]
  [ 0.50060626  0.83361215 -0.16428559 -0.16581433]
  [ 0.49428127 -0.16428559  0.8377901  -0.16371932]
  [ 0.49888074 -0.16581433 -0.16371932  0.83475721]]]

b=svd[1]

b= [[4.98638127]
 [4.98638127]]

c=svd[2]

c= [[[1.]]

 [[1.]]]

我对示例应用相同的方法

R = [[190.93095651 189.30517758] [187.01785506 185.38861727] [183.29225361 181.47205695]] 

u, s, vh = np.linalg.svd(R, full_matrices=True) 

当我尝试使用 print((u * s) @ vh) 重建它时,我得到了错误

" operands could not be broadcast together with shapes (3,3) (2,)"

【问题讨论】:

  • 除非您提供有关如何为每个操作数执行填充的确切指南,否则这没有多大意义。还有什么是期望的输出?
  • 矩阵代数中的规则不是需要一维彼此相等吗?矩阵 1 和 2 的尺寸分别为 2x3 和 3X5。两者的 1 维都是 3,因此输出矩阵是 2x5。您的矩阵是 4x4 和 1x2。我不明白矩阵 C 有什么。基本上我是说你不能将这些矩阵相乘,因为它们的维度。
  • @CliffordPiehl - 问题是如何添加零 [...] 来执行乘法
  • @Ivan 我编辑了帖子,请您检查一下
  • @CliffordPiehl 我编辑了帖子,请您检查一下

标签: python numpy numpy-ndarray


【解决方案1】:

numpy.linalg.svd的文档页面中解释了如何使用svd的返回值来重构输入矩阵:

linalg.svd(a, full_matrices=True, compute_uv=True, hermitian=False)

参数

  • a (…, M, N) array_like
    带有a.ndim >= 2 的实数或复数数组。

返回

  • u { (…, M, M), (…, M, K) } array
    单一数组。第一个a.ndim - 2 个维度与输入a 的大小相同。最后两个维度的大小取决于full_matrices 的值。仅当 compute_uvTrue 时返回。
  • s (…, K) array
    具有奇异值的向量,在每个向量中按降序排序。第一个a.ndim - 2 个维度与输入a 的大小相同。
  • vh { (…, N, N), (…, K, N) } array
    单一数组。第一个a.ndim - 2 个维度与输入a 的大小相同。最后两个维度的大小取决于full_matrices 的值。仅当 compute_uvTrue 时返回。

[...] 当a是一个二维数组时,它被分解为u @ np.diag(s) @ vh = (u * s) @ vh,其中u和vh是二维酉数组,s是a的奇异值的一维数组。当 a 为高维时,SVD 以堆叠模式应用 [...]。


您可以根据您的用例调整给定的示例:

>>> X_b = np.array([[[2.52390408], [2.4962137], [2.46467486], [2.48760957]],
                    [[2.52390408], [2.4962137], [2.46467486], [2.48760957]]])

>>> u, s, vh = np.linalg.svd(X_b[...,0], full_matrices=True)
>>> u.shape, s.shape, vh.shape
((2, 2), (2,), (4, 4))

重构X_b

>>> (u * s) @ vh[:2,:]
array([[2.52390408, 2.4962137 , 2.46467486, 2.48760957],
       [2.52390408, 2.4962137 , 2.46467486, 2.48760957]])

>>> np.allclose((u * s) @ vh[:2,:], X_b[...,0])
True

【讨论】:

  • 我对示例应用相同的方法 R = [[190.93095651 189.30517758] [187.01785506 185.38861727] [183.29225361 181.47205695]] u, s, vh = np.linalg=svd当我尝试使用 print((u * s) @ vh) 重建它时,出现错误“操作数无法与形状 (3,3) (2,) 一起广播”
  • 你能用这个例子和相应的错误回溯编辑你的问题吗?
  • 我编辑帖子
猜你喜欢
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多