使用 MATLAB 匹配 numpy rand ndarrays

问题描述 投票:0回答:1

我正在尝试将 numpy 随机生成的 ndarray 与 MATLAB 进行匹配。

import numpy as np

# Set the seed for NumPy's random generator
np.random.seed(42) #Mersenne Twister is default
    
# Generate complex random numbers
a = 16
b = 4
c = 10
x_py = np.random.rand(a, b, c) + 1j * np.random.rand(a, b, c)

这是 MATLAB 版本:

% Set the seed for MATLAB's random generator
rng(42, 'twister')  % Use the Mersenne Twister algorithm

% Generate complex random numbers
a = 16;
b = 4;
c = 10;
x_ml = rand([a, b, c], 'like', 1i);

现在,虽然种子和生成器类型匹配,但状态不匹配,所以我无法匹配 x_py 和 x_ml。

我知道更简单的方法是在 MATLAB 中生成、保存到文件并在 Python 中导入,但我想了解这两个 API 工作方式之间的差异以及如何调整它们以获得匹配的输出。

numpy matlab random random-seed
1个回答
0
投票

这个问题与另一个问题非常相似,但除此之外我们正在处理复数。

根据其他问答,MATLAB 按列填充数组,而 Python 按行填充数组。您需要转置一个结果以匹配另一个结果。对于 3D 数组,Python 中的索引顺序为 [z,y,x],MATLAB 中为 [y,x,z]。不过,存储顺序是相反的,在 MATLAB 中,y(第一个)索引是索引连续内存地址的索引,而 Python 中的 x(最后一个)索引则执行此操作。因此,我们需要定义具有不同大小顺序的数组,然后排列维度以使它们匹配。

另一个问题是,在 Python 中,

np.random.rand(a, b, c) + 1j * np.random.rand(a, b, c)

 首先生成所有实值,然后生成所有虚值。在 MATLAB 中,
rand([a, b, c], 'like', 1i)
 将生成一个实值,然后生成一个虚值,然后生成一个实值,依此类推。

将所有内容放在一起,

x_ml = permute(rand([c, b, a]) + 1j * rand([c, b, a]), [2,1,3])
产生与问题中的

x_py

相同的数组。

© www.soinside.com 2019 - 2024. All rights reserved.