关于matlab:如何重塑一个矩阵,然后将它与另一个矩阵相乘,然后在python中再次重塑它
How to reshape a matrix and then multiply it by another matrix and then reshape it again in python
我在将 python 与矩阵乘法和整形结合使用时遇到了问题。例如,我有一个大小为
|
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) |
但是我在这里得到一个错误,我们无法将大小为 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 |
相关讨论
- 您可以只使用
S.reshape(4, 4) 返回的临时视图,而不是修改原始数组对象。
请记住,Matlab 中的
所以给定形状
将
|
1
|
np.moveaxis(np.dot(np.moveaxis(H, -1, 0), S.reshape(4, 4).T), 0, -1)
|
内部
或者,您可以使用
的事实
|
1
|
np.transpose(S.reshape(4, 4), np.transpose(H))
|
相关讨论
- 是的,这与 MIMO 信道和长度 = 16 的多径信道有关。你在那个领域工作吗?我这样做是对的吗?
- @Gze。不幸的是我不知道。我只是习惯于从图像处理应用程序中调用第三维"通道"。我不知道你在做什么在概念上是否正确,但如果是,这就是这样做的方法。
- 您能否用我应该使用的完整代码更新答案?
-
@Gze。我可以,但是您的 Matlab 与您的散文不匹配。我正在尝试复制您的 Matlab,所以如果您可以匹配,我会将调用添加到
mean
您的解决方案中有两个问题
1) reshape 方法采用单个元组参数形式的形状,而不是多个参数。
2) y 数组的形状应该是 16x1x16,而不是 4x4x16。在 Matlab 中,没有问题,因为它会在您更新时自动重塑
正确的版本如下:
|
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) |
相关讨论
- .. 所以平均值(y,3);在 matlab 中可以使用 python 中的 np.mean(y,3) 来完成吗?
-
@Gze 在 python 中,您指定要平均数组的轴。我想你想要
np.mean(y,axis=2) ,因为枚举从 python 中的0 开始。假设您的 Matlab 代码是正确的,我会检查 Python 版本的一致性 - 抱歉,但是现在从 y = np.mean(y,axis=2) 得到的 y 的形状是 (16,1) 如果我想要它的形状是 (16,)
- @MadPhysicist 不幸的是我得到了不同的结果!你的意思是这里有错误? ..我会试试你的解决方案
- @MadPhysicist,你能扩展一下吗?它说整数或整数元组。 docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.h??tml
-
OP 使用的是数组方法
np.ndarray.reshape ,而不是函数。请参阅链接中的注释。