<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>KroneckerProduct on 陈星宇 (Xingyu Chen)</title><link>https://cxy0714.github.io/tags/kroneckerproduct/</link><description>Recent content in KroneckerProduct on 陈星宇 (Xingyu Chen)</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 17 Mar 2023 18:34:35 +0800</lastBuildDate><atom:link href="https://cxy0714.github.io/tags/kroneckerproduct/index.xml" rel="self" type="application/rss+xml"/><item><title>Mathematica踩坑-矩阵符号计算</title><link>https://cxy0714.github.io/2023/03/17/mathematica%E8%B8%A9%E5%9D%91-%E7%9F%A9%E9%98%B5%E7%AC%A6%E5%8F%B7%E8%AE%A1%E7%AE%97/</link><pubDate>Fri, 17 Mar 2023 18:34:35 +0800</pubDate><guid>https://cxy0714.github.io/2023/03/17/mathematica%E8%B8%A9%E5%9D%91-%E7%9F%A9%E9%98%B5%E7%AC%A6%E5%8F%B7%E8%AE%A1%E7%AE%97/</guid><description>&lt;h2 id="问题由来">问题由来&lt;/h2>
&lt;p>最近为了推导公式，需要验证一些（20多个）高维矩阵的内积结果（手算1-8h不等），而且需要一个靠谱的帮助我检验计算结果的工具。所以想到了Mathematica。&lt;/p>
&lt;p>我的计算大概是：$k^2\times k^5$的两个矩阵$A,B$做内积：$Tr(A \cdot B^T)$。通过$Tr$的可交换性质可以转化为$1 \times k^2$的行向量与$k^2\times k^5$的矩阵与$k^5\times 1$的列向量一个&amp;quot;内积&amp;quot;，所以就是一堆（$k^2\times k^5$）数相加，不过矩阵$A,B$都不是标量矩阵，元素都是符号，维数也还会随公式的阶数增高。&lt;/p>
&lt;p>下面是矩阵大概的形式（还有更长的），其中$Dimensions[\eta_2^{-1}]=k\times k,Dimensions[\eta_1]=k\times 1$。$I_k$是$k$阶单位阵，$K_{k,k}$是$k^2\times k^2$矩阵，学名叫作交换矩阵（Commutation Matrix），在矩阵向量化操作和矩阵张量积里是一个重要的工具，可以简单看&lt;a href="https://blog.csdn.net/weixin_39274659/article/details/113747158">交换矩阵 commutation matrix：理论与matlab仿真_B417科研笔记的博客-CSDN博客&lt;/a>来了解，要了解更多Commutation Matrix可以搜英文。&lt;/p>
$$vec^{T}(\eta_{2}^{-1}\eta_{1}\eta_{1}^{T}\eta_{2}^{-1})\otimes\eta_{2}^{-1}\otimes\eta_{2}^{-1}\cdot I_{k}\otimes K_{k,k}\otimes I_{k}$$&lt;p>还有这个$vec^T \eta_2^{-1}$中的$vec():\mathbb{R}^{p\times q} \rightarrow \mathbb{R}^{pq\times1}$算子，就是把矩阵重新排序成为列向量，&amp;ldquo;拉直&amp;rdquo;，这个是定义矩阵导数的工具。&lt;/p>
&lt;p>（关于矩阵对矩阵求导数：考虑矩阵函数对矩阵变元求导，得到的导数的元素如何排列？一个想法就是把矩阵都拉成向量，这样就化为了向量函数对向量变元求导，这是微积分都很熟悉的，有一些好的排布规则，并且可以证明，这种形式的矩阵导数有比较好的性质，比如简便的链式法则，以及$X$对自己求导时得到的是一个单位阵。另一个想法就是直接像矩阵张量积一样的排布导数，首先你可以想象一下$X$对自己求导的结果，它甚至不是一个单位阵，不过这只是槽点之一，我还没有了解更多。更多信息可以看这本书的$\S1.4$节：&lt;a href="https://link.springer.com/book/10.1007/1-4020-3419-9">Advanced Multivariate Statistics with Matrices | SpringerLink&lt;/a>，本书也介绍了vec和Commutation Matrix的性质，比较全面。）&lt;/p>
&lt;p>具体地，$vec(A)=vec([a_1,a_2,…,a_n])=[a_1^T,a_2^T,…,a_n^T]^T$。&lt;/p>
&lt;p>矩阵张量积（Tensor Product）是$A\otimes B=[a_{i,j}B]_{(i,j)}$。也叫克罗内克积（Kronecker product），外积，直积。&lt;/p>
&lt;p>总之我的矩阵里充斥着矩阵张量积，vec操作和交换矩阵$K_{p,q}$。同时我预测出了这些矩阵内积的结果，我希望比较一下他们是否相等，检验我的预测。&lt;/p>
&lt;h3 id="mathematica">Mathematica&lt;/h3>
&lt;p>我在大一寒假时看过一些Mathematica的文章和视频，之后用它做了一些大学物理实验的一些公式的计算？但是似乎纯粹当计算器用的，没有太多复杂的操作，等于熟悉了一下基本的文档操作吧。（不小心全给删除清空了，所以记不得到底干过啥了。）但是我也看过许多他的例子，精美的例子之类的，对他友好的帮助文档印象很深，还有就是清华大学数学科学学院&lt;a href="http://blog.siqiliu.com/cn/index.html">刘思齐老师&lt;/a>的&lt;a href="https://www.bilibili.com/video/BV1av411N7Xi/?spm_id_from=333.999.0.0&amp;vd_source=d604f008cde1c2b512c49f045d95e4cd">Mathematica网课&lt;/a>很好。&lt;/p>
&lt;p>之前我下载了Mathematica 13.0的中文破解版，然后现在要用它的时候发现我需要的内置函数在13.1版本才出现了，这时候再去搜索一圈，已经找不到免费的资源了，全是加微信公众号关注，xx币购买链接云云，一直就很反感这些东西。&lt;/p>
&lt;p>所以我找到了官网，发现新用户可以免费试用15天，但是直接下载电脑版还需要一些操作，就没有下载pc版，发现Mathematica有云系统，可以在线编译，存储云文件，网站:&lt;a href="https://mathematica.wolframcloud.com/">Wolfram Mathematica (wolframcloud.com)&lt;/a>。在线编译已经完全可以满足我的需要了。而且我的运算量也不太大，跑代码基本都是秒出。但是可以帮我省去几十个小时的计算了！&lt;/p>
&lt;h2 id="写代码时碰到的问题">写代码时碰到的问题&lt;/h2>
&lt;h3 id="mathematica中的矩阵和行向量列向量">Mathematica中的矩阵和行向量、列向量&lt;/h3>
&lt;p>Mathematica帮助文档里有&lt;a href="https://reference.wolfram.com/language/guide/MatricesAndLinearAlgebra.html">矩阵和线性代数—Wolfram 语言参考资料&lt;/a>。&lt;/p>
&lt;p>Mathematica中定义向量和矩阵的内置函数有Table[],Array[],也可以用来构造向量。但是我一开始却始终搞不清楚他们的维数怎么回事。现在我明白了，&lt;strong>两个花括号&lt;code>{{}}&lt;/code>包住的就是矩阵&lt;/strong>，&lt;strong>一个花括号&lt;code>{}&lt;/code>就是Mathematica里的向量&lt;/strong>，Mathematica里的向量&lt;strong>既不是行向量，也不是列向量&lt;/strong>，如果向量在运算中放在右边就是列向量，放在左边就是行向量，你使用转置函数Transpose[]也没用。所以这个问题让我一开始搞得一头雾水。算矩阵乘法时不知道哪里出了错。&lt;/p>
&lt;p>如果你需要定义列向量，请这样定义：&lt;/p>
&lt;p>&lt;code>T=Array[b,{2,1}]&lt;/code>&lt;/p>
&lt;p>这样他就是两个花括号包裹了，将其视为$2\times 1$的矩阵，即列向量。&lt;/p>
&lt;p>另一个问题是，在&lt;strong>定义矩阵时不要在后面加上//MartixForm&lt;/strong>，一般在后面加上这个语句可以让你的输出变成好看的矩阵形式（否则会输出&lt;code>{{}}&lt;/code>的列表形式，看起来不方便），但是如果你在定义里加上了这个，后面的矩阵计算会出现各种问题，这是我一开始矩阵运算失败的第二个问题，然后绝望之下在听清华数院的刘思齐老师的一个Mathematica网课中，他提到了这一句：&lt;a href="https://www.bilibili.com/video/BV1av411N7Xi?p=9&amp;vd_source=d604f008cde1c2b512c49f045d95e4cd">lecture-2-4_哔哩哔哩_bilibili&lt;/a>，在我心里救了Mathematica一命。&lt;/p>
&lt;p>另外用Dimensions[]函数可以查看矩阵（多少个花括号都行）的维数。&lt;/p>
&lt;p>比如$p\times q$的矩阵被Dimensions[]作用之后结果是 &lt;code>{p,q}&lt;/code>。&lt;/p>
&lt;h3 id="矩阵张量积">矩阵张量积&lt;/h3>
&lt;p>矩阵张量积(外积，直积)这个在Mathematica里直接有函数KroneckerProduct[]。&lt;/p>
&lt;p>但是一开始我竟然没有搜索到KroneckerProduct[]，先是搜索到了Outer 外积，这个东西是张量外积，两个向量（1个花括号的）可以用这个得到矩阵，但是矩阵和矩阵用这个做外积，虽然形式上是一样的，但是它会出现4个花括号，用Dimensions[]看其维数，会得到类似这样的结果 &lt;code>{2,2,2,2}&lt;/code>这已经不是矩阵的维数了。这个是我在计算中遇到的第三个问题，好在最后发现了他有正经的矩阵外积函数KroneckerProduct[]&lt;/p>
&lt;p>所以矩阵张量积积直接用函数KroneckerProduct[]。&lt;/p>
&lt;h3 id="vec算子的定义和交换矩阵k_pq的定义">vec算子的定义和交换矩阵$K_{p,q}$的定义&lt;/h3>
&lt;p>这两个函数的定义，我在一通搜索之后，置换矩阵PermutationMatrix[]的&lt;strong>应用举例&lt;/strong>中：&lt;a href="https://reference.wolfram.com/language/ref/PermutationMatrix.html">PermutationMatrix—Wolfram 语言参考资料&lt;/a>发现了。&lt;/p></description></item></channel></rss>