Matlab 有条件地替换相邻单元

Matlab 有条件地替换相邻单元,matlab,for-loop,conditional-statements,Matlab,For Loop,Conditional Statements,假设我有一个矩阵a: A= 我想创建一个相同维度的新矩阵B,其中所有矩阵和伴随的相邻矩阵都被以下矩阵替换: X= 矩阵X中的2应置于1值的“顶部”,以获得: B= 在元素重叠的地方应加上值,矩阵X应在扩展矩阵A/B维度的地方被“截断”。想法是最终用二维高斯分布代替X,矩阵A将很大,包含更多的矩阵。因此,代码的效率和速度是至关重要的。这是我想出的代码: 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 = zero

假设我有一个矩阵
a

A=

我想创建一个相同维度的新矩阵
B
,其中所有
矩阵和伴随的相邻矩阵都被以下矩阵替换:

X=

矩阵
X
中的
2
应置于
1
值的“顶部”,以获得:

B=

在元素重叠的地方应加上值,矩阵
X
应在扩展矩阵
A/B
维度的地方被“截断”。想法是最终用二维高斯分布代替
X
,矩阵
A
将很大,包含更多的
矩阵。因此,代码的效率和速度是至关重要的。这是我想出的代码:

 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
A=[0110;0010;0010;0010]
X=[11;12;11]
B=零(4,4);
t=1;
indA=find(A=1);
indX=find(X=2);
全部=查找(X>0);
[iall jall]=ind2sub(尺寸(X),全部);
[ia ja]=ind2sub(尺寸(A),indA)
[ix jx]=ind2sub(尺寸(X),indX)
iv=ia ix
jv=ja-jx
对于t=1:numel(iv),
ib=iall+iv(t);
jb=jall+jv(t);
ibjb=[ib(:),jb(:)]
c1=(ibjb(:,1)>4)|(ibjb(:,1)4)|(ibjb(:,1)您需要的是(2D)卷积。因此使用:

 1     1     1
 1     2     1
 1     1     1
 1     2     1     0
 1     1     2     1
 0     0     1     2
 0     0     1     1
 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
B = conv2(A, X, 'same');