从此代码中删除for循环

时间:2013-09-05 16:36:49

标签: matlab optimization image-processing vectorization

我有一个问题。

我有两个矩阵nbd_new和nbd_old,它存储2D矩阵的线性索引nos,如phi_new和phi_old。 phi_old和amp; phi_new大小相同。我需要做的是计算集合nbd_new中的所有位置,但不计算集合nbd_old中的位置。然后对于每个这样的位置,我必须以这种方式更新phi_new:如果该位置的phi_old大于0,则将phi_new放在该位置=宽度+ 1,否则将phi_new放在该位置= - (宽度+ 1)

我写了这样的代码:

    C = setdiff(nbd_new,nbd_old);
    for k=1:length(C)
        if phi_old(C(k))>0
            phi_new(C(k))=(width+1);
        else
            phi_new(C(k))=-(width+1);
        end
    end

此代码有效但由于循环和if-then-else语句而非常慢。这段代码可以进一步优化吗?

提前全部感谢!!

编辑:请检查phi_old和phi_new是否都是2-D矩阵,矩阵C是该矩阵的线性索引(位置)的集合。如果我事先不清楚,我很抱歉。错误地,我写了你而不是phi。两者都是一样的。

1 个答案:

答案 0 :(得分:3)

不需要循环,请使用logical indexing

phi_new = zeros(size(phi_old)); % preallocate memory
phi_new(C(phi_old(C)>0)) =   (width+1);
phi_new(C(phi_old(C)<0)) = - (width+1);