Mathematica 中未知维度的符号矩阵
有没有办法在 Mathematica 中对维度未知的矩阵进行符号矩阵代数?例如,如果我有一个 MxL 矩阵 A 和一个 LxN 矩阵 B,我希望能够输入
A.B
并让它给我一个矩阵,其元素 ab[i,j]
Sum[a[i,l]*b[l,j],{l,1,L}]
由我正在解决的问题与此类似,但涉及 12 个矩阵的乘积,包括重复多次的相同矩阵(及其转置)。可能可以简化结果矩阵的值,但在我完成代数之前,这是否可能并不明显。这可能是一个我必须手动解决的问题,但如果 Mathematica 可以提供一些简化代数的帮助,那就容易多了。
Is there a way to do symbolic matrix algebra in Mathematica for matrices where the dimensions are unknown? For example, if I have an MxL matrix A and an LxN matrix B, I would like to be able to enter
A.B
And have it give me a matrix whose element ab[i,j]
is given by
Sum[a[i,l]*b[l,j],{l,1,L}]
The problem I'm working on is like this one, but involves the product of 12 matrices, including the same matrix (and its transpose) repeated several times. It will probably be possible to simplify the values of the resulting matrix, but it's not obvious whether this is possible until after I do the algebra. This may be a problem that I have to solve by hand, but it would be much easier if Mathematica could provide some help in simplifying the algebra.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这是浪费我早上时间的代码[死链接已删除]...它并不完整,但它基本上可以工作。您可以从之前的链接 [dead] 获取笔记本或复制下面的代码。
请注意,不久前 ask.sagemath 上出现了类似的问题。
与 Sasha 的解决方案类似,您可以使用某些字符串
"A"
定义符号矩阵,该字符串不必与符号
A
相同。好的,这是代码:输入方阵的简写(可以使其适用于不同的头...)
转置、共轭、共轭转置和逆矩阵下的行为
组合矩阵幂(包括单位矩阵)
以尺寸作为工具提示的漂亮打印。
为 Dot 定义一些规则。然后需要扩展,以便它可以处理标量等......
同样,如果 AB 是正方形,即使 A 和 B 都不是正方形,也可以取 AB 的倒数。
使 Transpose、Conjugate 和 ConjugateTranspose 分布在 Plus 上。
这是一些简单的测试/示例
现在是处理组件扩展的代码。就像萨沙的解决方案一样,我将重载部分。
一些符号
用于提取矩阵部分和矩阵的点积的 代码
需要添加检查以确保显式求和范围都是合理的。
一些示例:
Here's the code [dead-link removed] that wasted my morning... It's not complete, but it basically works. You can either get the notebook from the previous link [dead] or copy the code below.
Note that a similar question turned up on ask.sagemath not so long ago.
Almost like Sasha's solution, you define a symbolic matrix using
for some string
"A"
that does not have to be the same as the symbolA
. Ok, here's the code:Short hand for entering square matrices (could make it work for different heads...)
Behavior under Transpose, Conjugate, ConjugateTranspose and Inverse
Combining matrix powers (including the identity matrix)
Pretty printing with the dimension as a tooltip.
Define some rules for Dot. Need to extend then so that it can handle scalar quantities etc...
Also so that inverses of A.B can be taken if A.B is square, even if neither A nor B are square.
Make Transpose, Conjugate and ConjugateTranspose distribute over Plus.
Here's some simple tests/examples
Now for code that deals with the component expansion. Like Sasha's solution, I'll overload Part.
Some notation
Code to extract parts of matrices and
Dot
products of matricesNeed to add checks to ensure that explicit summation ranges are all sensible.
Some examples:
我不确定这是否真的很有帮助,但这可能是一个开始:
Now, define some symbolic matrices and do dot product:
评估矩阵元素:
I am not sure if this is really very helpful, but it could be a start:
Now, define some symbolic matrices and do dot product:
Evaluate matrix elements:
如果您愿意从 Mathematica 切换到 Python,您需要的功能位于 SymPy 的开发分支中。它应该在 0.72 版本中。
这些纯粹的符号对象还可以利用所有标准矩阵算法来显式定义矩阵
符号形状矩阵也是可行的
If you're willing to switch from Mathematica to Python the functionality you need is in the development branch of SymPy. It should be in the 0.72 release.
These purely symbolic objects can also make use of all of the standard matrix algorithms for explicitly defined matrices
Symbolic shaped matrices are doable too
您可以使用 NCAlgebra 来实现。例如:
将使用非交换项 $a_{i,j}$ 和 $b_{i,j}$ 定义符号矩阵
AA
和BB
。这些可以被操纵并产生您正在寻找的结果。例如:将使用
**
将两个矩阵相乘,将执行相同的操作,并将
使用
tp
进行转置。You can use NCAlgebra for that. For example:
will define symbolic matrices
AA
andBB
with noncommutative entries $a_{i,j}$ and $b_{i,j}$. These can get manipulated and produce the results you're looking for. For example:will multiply the two matrices using
**
,will do the same, and
will transpose using
tp
.我使用这种方法:
当作为
A = SymbolicMatrix["a", 2, 3];
或A = SymbolicMatrix[a, 2, 3];
调用时,它会创建 因此,它创建了m
xn
符号,但我发现它们具有描述性,并且整个东西很容易使用(至少对于我的目的而言)。
I use this approach:
When invoked as
A = SymbolicMatrix["a", 2, 3];
orA = SymbolicMatrix[a, 2, 3];
, it creates a matrixSo, it creates
m
xn
symbols, but I find them descriptive, and the whole thing is easy to use (at least for my purposes).