2017-02-28 48 views
0

我有单元阵列:如何根据某些标准替换数组中的单元格?

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),然后用0替换它们相应的单元格。

在给出的示例中,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 

然而,这是预期的第三排,但不第四排。我不知道我在这里做错了什么,但我不知道还有什么要做。

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

回答

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时,如果下一个或前一个线接近。

+0

谢谢@ m7913d。它完美的作品。请你能解释一下这是如何工作的,特别是这个'isPreviousToClose'的东西? – User1772

+0

如果上一行被删除,则'isPreviousToClose'为true。如果当前行与您的标准匹配,则如果前一行关闭(即,“isPreviousToClose”)或下一行将关闭,则该行太靠近。最后一行需要单独的if测试,因为它不在for循环中处理('size(im,1)-1')。 为了更好地理解程序,使用matlab调试器逐步运行代码会很有用。 – m7913d

+0

是的,我明白你的意思了。非常感谢... ...非常感谢... – User1772

相关问题