【问题标题】:Conditionally replace neighbouring cells有条件地替换相邻单元格
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多