如何在SymPy中创建和查看形状可变的索引矩阵集合
问题
在SymPy中,我想要创建一组X_i矩阵,每个矩阵的尺寸为n_i × p(其中i = 1, ..., M,出自Pinheiro和Bates 2000年著作第58页)。请问能否实现?我还希望能打印这组矩阵查看每个矩阵的结构,最终这些X_i矩阵会用于后续的运算。
我查阅了Indexed的文档,但我的理解是它仅能提供一个可索引的符号,无法满足创建可变尺寸矩阵组的需求。
尝试的解决方案
我首先尝试了以下代码:
import sympy as sm sm.init_printing() M = sm.symbols('M', integer = True) # M组 i = sm.Idx('i', (1, M)) X = sm.IndexedBase('X') X[i].ranges
输出结果为:
[(1, M)]
但这并不是一组矩阵,而且每个矩阵也没有可变的行数(行数需要由n_i决定)。
之后我进一步搜索并咨询了相关工具,得到的信息显示似乎无法为索引设置任意上限。工具提供了如下模板,但它指定了p = 2和M = 5,且每个矩阵的行数固定为5:
n = 5 p = 2 M = 5 X=[sm.Matrix(n, p, lambda r, c: f'a_{r+1}{c+1}_{i}') for i in range(1,M+1)] X
输出结果为:
⎡⎡a₁₁ ₁ a₁₂ ₁⎤ ⎡a₁₁ ₂ a₁₂ ₂⎤ ⎡a₁₁ ₃ a₁₂ ₃⎤ ⎡a₁₁ ₄ a₁₂ ₄⎤ ⎡a₁₁ ₅ a₁₂ ₅ ⎢⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎢⎢a₂₁ ₁ a₂₂ ₁⎥ ⎢a₂₁ ₂ a₂₂ ₂⎥ ⎢a₂₁ ₃ a₂₂ ₃⎥ ⎢a₂₁ ₄ a₂₂ ₄⎥ ⎢a₂₁ ₅ a₂₂ ₅ ⎢⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎢⎢a₃₁ ₁ a₃₂ ₁⎥, ⎢a₃₁ ₂ a₃₂ ₂⎥, ⎢a₃₁ ₃ a₃₂ ₃⎥, ⎢a₃₁ ₄ a₃₂ ₄⎥, ⎢a₃₁ ₅ a₃₂ ₅ ⎢⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎢⎢a₄₁ ₁ a₄₂ ₁⎥ ⎢a₄₁ ₂ a₄₂ ₂⎥ ⎢a₄₁ ₃ a₄₂ ₃⎥ ⎢a₄₁ ₄ a₄₂ ₄⎥ ⎢a₄₁ ₅ a₄₂ ₅ ⎢⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎥ ⎢ ⎣⎣a₅₁ ₁ a₅₂ ₁⎦ ⎣a₅₁ ₂ a₅₂ ₂⎦ ⎣a₅₁ ₃ a₅₂ ₃⎦ ⎣a₅₁ ₄ a₅₂ ₄⎦ ⎣a₅₁ ₅ a₅₂ ₅ ⎤⎤ ⎥⎥ ⎥⎥ ⎥⎥ ⎥⎥ ⎥⎥ ⎥⎥ ⎥⎥ ⎦⎦
尽管可以进一步调整代码生成行数不同的M个矩阵,但我有两点疑虑:
- 这种方法可能无法适配SymPy的其他运算(如矩阵代数、向量微积分等);
- 由于没有使用
Idx或IndexedBase,这不符合SymPy的惯用写法。
恳请提供可行的解决方案。
可接受但非首选的解决方案
- 将
M定义为具体整数,如M = 5,设置明确的上限 - 将每个
n_i和p定义为具体整数,比如n = [10,10,12,12,24]、p=5,让每个X_i矩阵被明确定义
内容的提问来源于stack exchange,提问作者user26548996
相关产品推荐
相关产品推荐

