写作业的时候遇到了这样的问题,于是自己尝试解决了一下,其实就是构造一个特殊的,只有特定位置有1的矩阵,比如:
进而实现下图中A到B的变化:
然后再对应乘上相应的系数,最后加在一起,就可以实现标题中所说的功能了,代码如下:
function BinA = inset(A B)
%% 这里其实我也不是很想用循环,但是实在难以找到同时处理多个矩阵的方法,我能想到
%% 的一种做法是,A1B1+A2B2+...其实相当于[A1 A2 ...][B1; B2; ...],所以可以在构
%% 造的时候就一并构造了,我觉得吧,循环更能体现具体的计算思路,所以这样的改进,
%% 我是拒绝的
BinA = 0;
for i = 1:size(B, 1)
for j = 1:size(B, 2)
BinA = BinA + B(i, j)*disperse_mat(A, size(B, 1), size(B, 2), i, j);
end
end
end
function dpmat = disperse_mat(mat, m, n, i, j)
%mat指将要处理的矩阵,m,n分别为行数的扩大倍数和列数的扩大倍数,i,j分别指扩大后,
%原矩阵元素所对应的位置,返回的是处理好的扩大版矩阵
dp_row = ~(m*repmat(linspace(1,size(mat,1),size(mat,1)), m*size(mat, 1), 1)...
-repmat(linspace(1, m*size(mat,1), m*size(mat,1))', 1, size(mat, 1)) -(m-i));
dp_line = ~(n*repmat(linspace(1,size(mat,2),size(mat,2))', 1, n*size(mat, 2))...
-repmat(linspace(1, n*size(mat,2), n*size(mat,2)), size(mat, 2), 1) -(n-j));
dpmat = dp_row*mat*dp_line;
end