在Matlab上进行矩阵展开的逆过程



我的程序允许将给定的B矩阵与具有下面列出的一些特性的z因子相乘,以得到H矩阵。我想有一个编程想法来做我编程的。也就是说,对于给定的H矩阵,求出B矩阵的值。

例如,使用矩阵B = [-1 -1 ; 1 0]

我用我的代码得到了一个矩阵:

H = [ 0 0 0 0 0 0 ; 
0 0 0 0 0 0 ; 
0 0 0 0 0 0 ; 
0 1 0 1 0 0 ; 
0 0 1 0 1 0 ; 
1 0 0 0 0 1 ]

我希望从代码H得到矩阵B的值。

要从矩阵B指定矩阵H,需要:

每个系数-1被维度为z*z空矩阵替换;

每个系数0被维度为z*z单位矩阵代替;

每个系数CCD_ 13被向右移动CCD_ 15位置的维度为CCD_。

根据矩阵B和展开因子z,我们构造了一个扩展的n-k行和n列的二进制H矩阵。

我的代码:

clear;
close all;
B = [-1 -1 ; 1 0];
z = 3;
H = zeros(size(B)*z);
Y = eye(z);
for X1 = 1:size(B,1)

for X2 = 1:size(B,2)

X3 = B(X1,X2);

if (X3 > -1)
X4 = circshift(Y,[0 X3]);
else
X4 = zeros(z);
end
Y1 = (X1-1)*z+1:X1*z;
Y2 = (X2-1)*z+1:X2*z;
H(Y1,Y2) = X4;
end
end
[M,N] = size(H);

有什么建议吗?

假设所有输入矩阵都是良好的形式,则可以根据每个块的第一行来确定映射。例如,块映射到1:

0 1 0
0 0 1
1 0 0

在第1行的第2列中具有1。类似地,第1列中的1映射到0,第3列映射到2。行中没有映射到-1。所以我们只需要在第一行中找到包含1的列。

令人烦恼的是,当find没有找到非零值而不是0(这正是我们在这种情况下想要的(时,它会返回null。我们可以通过向矩阵行添加一个值来对此进行调整,当所有其他值都为0时,该值仅为1。

如果你有图像处理工具箱,你可以使用blockproc为你处理循环:

B = blockproc(H, [z z], @(A)find([~any(A.data(1,:)) A.data(1,:)])-2);

否则,只需在块上循环并将函数应用于每个块。

相关内容

  • 没有找到相关文章

最新更新