关于matlab:如何重塑一个矩阵,然后将它与另一个矩阵相乘,然后在python中再次重塑它

How to reshape a matrix and then multiply it by another matrix and then reshape it again in python

我在将 python 与矩阵乘法和整形结合使用时遇到了问题。例如,我有一个大小为 (16,1) 的列 S 和另一个大小为 (4,4) 的矩阵 H,我需要将列 S 重新整形为 (4,4) 以便将它与 H 相乘并且然后再次将其重新整形为 (16,1),我在 matlab 中进行了如下操作:

1
2
3
4
5
6
7
clear all; clc; clear
H = randn(4,4,16) + 1j.*randn(4,4,16);
S = randn(16,1) + 1j.*randn(16,1);
for ij = 1 : 16
    y(:,:,ij)     = reshape(H(:,:,ij)*reshape(S,4,[]),[],1);
end  
y = mean(y,3);

来到python:

1
2
3
4
5
6
7
import numpy as np

H = np.random.randn(4,4,16) + 1j * np.random.randn(4,4,16)
S = np.random.randn(16,) + 1j * np.random.randn(16,)
y = np.zeros((4,4,16),dtype=complex)
for ij in range(16):
    y[:,:,ij] = np.reshape(h[:,:,ij]@S.reshape(4,4),16,1)

但是我在这里得到一个错误,我们无法将大小为 256 的矩阵 y 重新整形为 16x1。

有人知道如何解决这个问题吗?


只需这样做:

1
2
3
4
S.shape = (4,4)
for ij in range(16):
    y[:,:,ij] = H[:,:,ij] @ S
S.shape = -1 # equivalent to 16


np.dot 如果两个操作数有两个或多个轴,则对两个操作数的最后一个和倒数第二个轴进行操作。你可以移动你的轴来使用它。

请记住,Matlab 中的 reshape(S, 4, 4) 可能等同于 Python 中的 S.reshape(4, 4).T

所以给定形状 (4, 4, 16)H 和形状 (16,)S,您可以使用

H 的每个通道乘以重新整形的 S

1
np.moveaxis(np.dot(np.moveaxis(H, -1, 0), S.reshape(4, 4).T), 0, -1)

内部 moveaxis 调用使 H 变为 (16, 4, 4) 以便于乘法。外面的效果相反。

或者,您可以使用 S 将被转置为 write

的事实

1
np.transpose(S.reshape(4, 4), np.transpose(H))


您的解决方案中有两个问题

1) reshape 方法采用单个元组参数形式的形状,而不是多个参数。

2) y 数组的形状应该是 16x1x16,而不是 4x4x16。在 Matlab 中,没有问题,因为它会在您更新时自动重塑 y

正确的版本如下:

1
2
3
4
5
6
7
import numpy as np

H = np.random.randn(4,4,16) + 1j * np.random.randn(4,4,16)
S = np.random.randn(16,) + 1j * np.random.randn(16,)
y = np.zeros((16,1,16),dtype=complex)
for ij in range(16):
    y[:,:,ij] = np.reshape(H[:,:,ij]@S.reshape((4,4)),(16,1))