如何根据某些条件替换阵列中的单元格?

时间:2017-02-28 22:12:06

标签: matlab cell-array

我有单元格数组:

im = {'A+' NaN 'B-'; NaN NaN NaN; NaN 'A+' 'B+'; 'B+' NaN 'A-'; 'B+' NaN NaN; 'B-' 'A-', NaN}

我从中获得:

refPoints = find(( any(strcmp('A+', im),2) | any(strcmp('A-', im),2)) & (any(strcmp('B+', im),2) | any(strcmp('B-', im),2)))

给出:

refPoints = [1;3;4;6]

现在,我想循环遍历im,以便使距离太近的点(例如1倍)无效,然后用NaN替换相应的单元格。

在给定的示例中,refPoints 3 and 4已关闭,因此应该无效。因此,我希望我的最终结果是:

im = {'A+' NaN 'B-'; NaN NaN NaN; NaN NaN NaN; NaN NaN NaN; 'B+' NaN NaN; 'B-' 'A-', NaN}

refPoints = [1;6]

我尝试过以下代码:

 for ii = 1: size(im, 1)-1

    if find(( any(strcmp('A+', im(ii,:))) | any(strcmp('A-', im(ii,:)))) & (any(strcmp('B+', im(ii,:))) | any(strcmp('B-', im(ii,:)))))==true ...
         & find(( any(strcmp('A+', im(ii+1,:))) | any(strcmp('A-', im(ii+1,:)))) & (any(strcmp('B+', im(ii+1,:))) | any(strcmp('B-', im(ii+1,:)))))==true

    im(ii,:) ={NaN};

   end

end

然而,这对第3行而不是第4行有预期效果。我不知道我到底做错了什么,但我不知道还能做什么。

对此有任何帮助,建议或建议非常感谢?先感谢您。

1 个答案:

答案 0 :(得分:0)

这个问题非常接近your previous question,但我希望这个略有不同的答案会对你有所帮助。

您可以通过引入状态变量isPreviousToClose来解决此问题,如下所示:

isPreviousToClose = false;
for ii = 1: size(im, 1)-1

    if (( any(strcmp('A+', im(ii,:))) || any(strcmp('A-', im(ii,:)))) && (any(strcmp('B+', im(ii,:))) || any(strcmp('B-', im(ii,:))))) ...
         && ( isPreviousToClose || (( any(strcmp('A+', im(ii+1,:))) || any(strcmp('A-', im(ii+1,:)))) && (any(strcmp('B+', im(ii+1,:))) || any(strcmp('B-', im(ii+1,:))))))
        isPreviousToClose = true;
        im(ii,:) ={NaN};
    else
        isPreviousToClose = false;
    end
end
if (isPreviousToClose)
    im(end,:) ={NaN};
end

如果下一行或前一行关闭,则当前行设置为NaN。