Warm tip: This article is reproduced from serverfault.com, please click

arrays-如何在Matlab上展开矩阵?

(arrays - How to unfold a Matrix on Matlab?)

发布于 2020-11-28 12:58:38

我有一个给定的矩阵H,我想通过以下方法展开(展开)它以找到一个矩阵B

H维度矩阵m × nx = gcd (m,n)

  1. 矩阵H分为两部分。
  2. 切割方式如下:
  • “对角切割”是通过将c = n/x单元向右交替移动(我们将c单元向右移动几次)来进行的。
  • 我们交替c-b = m/x向下移动单位(即b = (n-m)/x)(b向下移动单位几次)。
  1. 在应用矩阵的“对角线切割”之后,我们重复复制并粘贴两个部分以获得矩阵B。

:让H的矩阵m × n = 5 × 10定义为:

 1 0 1 1 1 0 1 1 0 0  
 0 1 1 0 0 1 1 0 1 1  
 1 1 0 1 1 1 0 1 0 0  
 0 1 1 0 1 0 1 0 1 1  
 1 0 0 1 0 1 0 1 1 1
  • 让我们来计算x = gcd (m,n) = gcd (5,10) = 5
  • 或者,向右移动:c = n/x = 10/5 = 2
  • 或者下移:b = (n-m)/x = (10-5)/5 = 1
  1. 对角线切割图:将矩阵H分为两部分。切割模式如下:
  • 我们将c = 2单位向右移动几次,单位向右移动c = 2
  • 我们反复将c - b = 1单元向下移动

我们得到: 在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

  1. 在应用矩阵的“对角线切割”之后,我们重复复制并粘贴两个部分以获得矩阵:

在此处输入图片说明

备注:在矩阵XX1X2短划线是零。

  1. 结果矩阵B为(Lis factor):

在此处输入图片说明

有什么建议么?

Questioner
m2016b
Viewed
22
Luis Mendo 2020-11-29 00:08:49

这可以通过创建具有切割图案的逻辑遮罩,然后逐个将输入乘以遮罩及其否定值来实现。L可以使用来重复blkdiag

H = [1 0 1 1 1 0 1 1 0 0
     0 1 1 0 0 1 1 0 1 1
     1 1 0 1 1 1 0 1 0 0
     0 1 1 0 1 0 1 0 1 1
     1 0 0 1 0 1 0 1 1 1];
L = 2;
[m, n] = size(H);
x = gcd(m, n);
c = n / x;
b = (n-m)/x;
mask = repelem(tril(true(m/b)), b, c);
A = [H.*mask; H.*~mask];
A = repmat({A}, L, 1);
B = blkdiag(A{:});