我的程序允许将给定的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);
否则,只需在块上循环并将函数应用于每个块。