如何重塑一个矩阵,然后将其乘以另一个矩阵,然后在python中再次重塑它

如何重塑一个矩阵,然后将其乘以另一个矩阵,然后在python中再次重塑它,python,matlab,Python,Matlab,我在使用python进行矩阵乘法和重塑时遇到了一个问题。例如,我有一列S的大小(16,1)和另一个矩阵H的大小(4,4),我需要将列S重塑为(4,4),以便将其与H相乘,然后再次将其重塑为(16,1),我在matlab中做了如下操作: 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) =

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

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:

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

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

只需这样做:

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

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

1) 重塑方法采用单个元组参数的形式,但不采用多个参数的形式

2) y阵列的形状应为16x1x16,而不是4x16。在Matlab中,没有任何问题,因为它会在更新时自动重塑
y

正确的版本如下所示:

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))
如果两个操作数有两个或多个轴,则在两个操作数的最后一个轴和第二个到最后一个轴上进行操作。你可以移动你的轴来使用它

请记住,Matlab中的
reformate(S,4,4)
可能相当于Python中的
S.reformate(4,4).T

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

np.moveaxis(np.dot(np.moveaxis(H, -1, 0), S.reshape(4, 4).T), 0, -1)
内部调用将
H
转换为
(16,4,4)
,以便于乘法。外部的一个反转效果

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

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

您可以只使用
S.reformate(4,4)
返回的临时视图,而不是修改原始数组对象。。。因此,平均值(y,3);在matlab中,可以使用python中的np.mean(y,3)?@Gze在python中指定要对数组求平均值的轴。我假设您想要
np.mean(y,axis=2)
,因为python中的枚举从
0
开始。假设你的Matlab代码是正确的,我会检查Python版本的一致性,但是现在由y=np得到的y。平均值(y,axis=2)是形状(16,1)的,如果我想要它是形状(16,)@MadPhysician不幸的是,我得到了不同的结果!!你是说这里有个错误。。我会试试你的solution@MadPhysicist,你能详细介绍一下吗?它表示int或int的元组。是的,这与MIMO信道和长度为16的多径信道有关。你在那个领域工作吗?这就是我所做的对吗?@Gze。不幸的是,我不知道。我只是习惯于从图像处理应用程序中调用三维“通道”。我不知道你所做的在概念上是否正确,但如果是,这就是方法。你能用我应该使用的完整代码更新答案吗?@Gze。我可以,但是你的Matlab和你的散文不匹配。我正在尝试复制你的Matlab,因此如果你能让它匹配,我将把调用添加到
mean