Mathematica中同名不同维度矩阵的读取与重存问题及解决
Mathematica批量重赋值矩阵的维度不匹配问题解决
场景说明
主程序完成大型计算后,通过Put[...]和Save[...]将结果保存为类文本文件,其中包含多个大维度矩阵,示例如下:
tab1 = {{1, 2, 3, 4, 5, 6}, {2, 4, 6, 8, 10, 12}, {3, 6, 9, 12, 15, 18}, {4, 8, 12, 16, 20, 24}} tab10 = {{10, 20, 30, 40, 50, 60}, {20, 40, 60, 80, 100, 120}, {30, 60, 90, 120, 150, 180}, {40, 80, 120, 160, 200, 240}}
后处理阶段,使用Get[savefile]读取文件,生成这些矩阵的降分辨率版本:
smalltab1 = tab1[[Range[1, 4, 2], Range[1, 6, 2]]] (* 输出:{{1,3,5},{3,9,15}} *) smalltab10 = tab10[[Range[1, 4, 2], Range[1, 6, 2]]] (* 输出:{{10,30,50},{30,90,150}} *)
最终需要将降分辨率后的小矩阵重赋值给原变量名(例如tab1 = smalltab1),再通过Save[newsavefile,{tab1,tab10,...}]保存新文件。
批量处理的问题
由于源文件中矩阵数量和名称不确定,先提取矩阵名列表tabs={"tab1","tab10",...},通过For循环结合With批量生成降分辨率矩阵,此步骤运行正常:
For[t = 1, t <= Length[tabs], t++, With[{lhs = Symbol["small" <> tabs[[t]]]}, lhs = Symbol[tabs[[t]]][[Range[1, 4, 2], Range[1, 6, 2]]]; ];
但执行批量重赋值时:
With[ {lhs = Symbol[tabs[[i]]], rhs = Symbol["small" <> tabs[[i]]]}, lhs = rhs ];
触发维度不匹配错误:
"Set::shape : Lists {...} and {...} are not of the same shape"
尝试使用ClearAll、Remove等命令,因变量局部性问题无法解决该错误。
有效解决方法
在批量重赋值之前,添加Clear @@ tabs语句清除所有原始矩阵变量,即可解决维度不匹配问题。完整可运行示例如下:
tab1 = {{1, 2, 3, 4, 5, 6}, {2, 4, 6, 8, 10, 12}, {3, 6, 9, 12, 15, 18}, {4, 8, 12, 16, 20, 24}}; tab10 = {{10, 20, 30, 40, 50, 60}, {20, 40, 60, 80, 100, 120}, {30, 60, 90, 120, 150, 180}, {40, 80, 120, 160, 200, 240}}; (* 从外部文件读取,矩阵数量和名称未知,遵循tab#命名规则 *) tabs = {"tab1", "tab10"}; (* 从外部文件自动提取生成的矩阵名列表 *) ltabs = Length[tabs]; (* 批量生成降分辨率矩阵,运行正常 *) For[t = 1, t <= ltabs, t++, With[ {lhs = Symbol["small" <> tabs[[t]]]}, lhs = Symbol[tabs[[t]]][[Range[1, 4, 2], Range[1, 6, 2]]]; ]; ]; Clear @@ tabs (* *此语句是解决问题的关键*,清除所有原始矩阵变量 *) (* 批量重赋值,问题解决 *) For[t = 1, t <= ltabs, t++, With[ {lhs = Symbol[tabs[[t]]], rhs = Symbol["small" <> tabs[[t]]]}, lhs = rhs ]; ];
执行后tab1输出为{{1, 3, 5}, {3, 9, 15}},符合预期。
内容的提问来源于stack exchange,提问作者Leela Michaels
相关产品推荐
相关产品推荐

