符号向量的 sympy 索引范围

sympy index range of vector of symbols

您好,我正在尝试索引符号向量的范围。

我的第一个想法是使用 MatrixSymbol

A = MatrixSymbol('A',10,1)
B = Matrix(A[0:2]) # does not work!

然后我想我可以使用 IndexBased,但是我如何生成子矩阵 B(我无法索引范围)

A=IndexedBased('A')
B=Matrix([A[0],A[1]]) # works but I want to define a range

必须有一个正确的方法来做到这一点。

IndexedBase 会给你一个像符号一样的一维向量。

您可以使用带有 range 的列表理解,给出索引:

>>> a = IndexedBase("A")
>>> Matrix([a[i] for i in range(2)])
Matrix([
[A[0]],
[A[1]]])

由于您在 Python 中工作,如果您想在 IndexedBase 上使用直接切片,您可以自由修改例程以满足您的需要:

def gi(self, slc):
  if isinstance(slc, slice):
      a,b,s=slc.start, slc.stop, slc.step
      s = s or 1
      a = a or 0
      assert all(type(i) is int or i is None for i in (a,b,s))
      assert b is not None
      rv = []
      for i in range(a,b,s):
        rv.append(self[i])
      return rv
  return _gi(self, slc)

_gi = IndexedBase.__getitem__
IndexedBase.__getitem__ = gi

修改后你现在可以做:

>>> x = IndexedBase('x')
>>> x[0]
x[0]
>>> x[:2]
[x[0], x[1]]

(这并不试图处理关键字参数;它更像是一个概念证明。)