【发布时间】:2014-04-17 09:09:35
【问题描述】:
假设我有一个矩阵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
矩阵X 中的2 应放在1 值的“顶部”以获得:
B =
1 2 1 0
1 1 2 1
0 0 1 2
0 0 1 1
值应该在元素重叠的地方相加,矩阵X应该在它扩展矩阵A/B的维度的地方被“切断”这个想法是最终用二维高斯分布和矩阵替换X A 将很大,包含更多 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
是否有更有效/更快的方式(最小化循环)来编写这个函数?
【问题讨论】:
标签: matlab for-loop conditional-statements