有条件地替换相邻的细胞

时间:2014-03-12 22:08:51

标签: matlab for-loop conditional-statements

假设我有一个矩阵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}}

是否有更有效/更快的方法(最小化循环)来编写此功能?

1 个答案:

答案 0 :(得分:0)

你想要的是(2D)卷积。所以使用conv2

B = conv2(A, X, 'same');