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');