在 Matlab 中有效地提取子矩阵

计算科学 matlab 矩阵
2021-12-11 21:40:19

假设我在Matlab R2013a中有这个矩阵

M = kron(A,B);

其中AB矩阵,其中是一个“大”数。现在,我只想提取 的一个子矩阵,由它只取几行组成N×NNM

Msub = M(rows,:);

其中rows是长度为的向量。mN


问:在Matlab R2013a中,有没有一种有效的方法来构建Msub而无需M之前构建?

1个回答

这是一个可能有帮助的想法。粗略地说,似乎克罗内克乘积的行是行的克罗内克乘积。(我希望在网上找到一个很好的参考,但我找不到;所以这里有一个小草图。)

一般来说,对于的元素的公式 (此定义参考 Tolimieri 等人,离散傅里叶变换和卷积算法,第 2 版,第 2 章。)AR×SBM×L=CRM×SLC

cm+rM,l+sL=ar,sbm,l

考虑 由于只有一行,因此P1×SQ1×L=Z1×SLZm=0r=0

z0,l+sL=a0,sb0,l

如果,即,同样,即,然后 这是i=m+rMPrAp0,s=ar,sQmBq0,l=bm,l

z0,l+sL=ar,sbm,l
iC

相应的算法将是这样的。要计算iC

r = floor(i/M);
m = i - r*M;
kron(A(r,:), B(m,:))

实际上这在 Matlab 中不太适用,因为上面的数学使用从 0 开始索引的数组,而Matlab 使用基于 1 的数组不幸的是,我没有方便的 Matlab 来测试这些实现细节。

即便如此,对于您的应用程序而言,将沿这些线计算的几行堆叠起来可能比从完整的 Kronecker 产品中选择一个子集更有效。