假设我有一个矩阵A
:
A =
0 1 0 0
0 0 0 0
0 0 0 1
0 0 0 0
我想创建一个具有相同维度的新矩阵B
,其中所有ones
和附带的邻居都被以下矩阵替换:
X =
1 1 1
1 2 1
1 1 1
矩阵2
中的X
应放在1
值的“顶部”以获取:
B =
1 2 1 0
1 1 2 1
0 0 1 2
0 0 1 1
值应该在元素重叠的地方加起来,矩阵X
应该在扩展矩阵A/B
的维度的地方“切断”。想法是最终将X
替换为A
2d高斯分布和矩阵ones
将很大,包含更多 A = [0 1 0 0;0 0 0 0;0 0 0 1;0 0 0 0]
X = [1 1 1;1 2 1;1 1 1]
B = zeros(4,4);
t=1;
indA = find(A==1);
indX = find(X==2);
all = find(X>0);
[iall jall] = ind2sub(size(X),all);
[ia ja] = ind2sub(size(A),indA)
[ix jx] = ind2sub(size(X),indX)
iv = ia-ix
jv = ja-jx
for t=1:numel(iv),
ib = iall+iv(t);
jb = jall+jv(t);
ibjb = [ib(:), jb(:)]
c1 = (ibjb(:,1)>4)|(ibjb(:,1)<1); c2 = (ibjb(:,2)>4)|(ibjb(:,1)<1);
ibjb((c1|c2),:)=[]
isel = ibjb(:,1)-iv(t)
jsel = ibjb(:,2)-jv(t)
B(ibjb(:,1), ibjb(:,2)) = B(ibjb(:,1), ibjb(:,2))+ X(isel, jsel)
t=t+1;
end
。因此,代码高效快速至关重要。这是我提出的代码:
{{1}}
是否有更有效/更快的方法(最小化循环)来编写此功能?