【问题标题】:How do I replace cells in an array based on some criteria?如何根据某些条件替换数组中的单元格?
【发布时间】:2017-02-28 22:12:05
【问题描述】:

我有元胞数组:

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 行来说是预期的。我不知道我到底做错了什么,但我不知道还能做什么。

非常感谢任何帮助、建议或意见?先感谢您。

【问题讨论】:

    标签: matlab cell-array


    【解决方案1】:

    这个问题非常接近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。

    【讨论】:

    • 谢谢@m7913d。它完美地工作。请您向我解释一下这是如何工作的,尤其是 isPreviousToClose 的东西?
    • isPreviousToClose 如果前一行被删除,则为真。如果当前行符合您的条件,如果前一行要关闭(即isPreviousToClose)或下一行要关闭,则它太接近了。最后一行需要单独的 if 测试,因为它不在 for 循环中处理 (size(im, 1)-1)。为了更好地理解程序,使用 matlab 调试器逐步运行代码会很有用。
    猜你喜欢
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多