如何将Matlab保存的Mersenne Twister随机生成器状态恢复到Numpy?
将Matlab保存的Mersenne Twister状态导入NumPy以复现随机序列
要实现这个需求,需要处理Matlab与NumPy对Mersenne Twister(MT19937)状态存储格式的差异,具体步骤如下:
1. 读取Matlab保存的状态文件
首先用scipy.io.loadmat读取Matlab导出的.mat文件,提取保存的随机生成器状态:
import numpy as np from scipy.io import loadmat # 读取Matlab保存的状态文件 mat_data = loadmat('rand_state.mat') # 提取状态结构体(Matlab的结构体在loadmat中会被转为二维数组) s = mat_data['s'][0, 0]
2. 转换状态格式
Matlab的State是一个625元素的数组:前624个是MT19937的核心状态值,第625个是1-based的当前索引;而NumPy的MT19937状态需要0-based索引,且状态格式为元组('MT19937', 状态数组, 索引)。我们需要做格式转换:
# 提取Matlab的State数组 mat_state_array = s['State'][0] # 分离核心状态值(前624个)并转为NumPy要求的uint32类型 mt_core_state = mat_state_array[:624].astype(np.uint32) # 将Matlab的1-based索引转为NumPy的0-based索引 mt_index = int(mat_state_array[624]) - 1
3. 初始化NumPy随机生成器并导入状态
创建RandomState实例,用set_state方法导入转换后的状态:
# 创建NumPy随机生成器实例 np_rng = np.random.RandomState() # 导入转换后的MT19937状态 np_rng.set_state(('MT19937', mt_core_state, mt_index))
验证效果
此时用np_rng生成的随机数,会和Matlab中加载状态后生成的随机数完全一致。例如在Matlab中执行:
load('rand_state.mat'); rng(s); % 生成3个随机数 disp(rand(1, 3));
在Python中执行:
print(np_rng.rand(1, 3))
两者输出结果完全相同。
注意:必须使用
set_state导入完整状态,而不是直接用RandomState(seed)——因为后者只能还原初始种子状态,无法复现Matlab中经过多次随机调用后的中间状态。
内容的提问来源于stack exchange,提问作者Divyansh Gupta
相关产品推荐
相关产品推荐

