如何根据某些条件替换数组中的单元格?
How do I replace cells in an array based on some criteria?
我有元胞数组:
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 行。我不知道我到底做错了什么,但我不知道还能做什么。
非常感谢您对此提供任何帮助、建议或意见?先感谢您。
这个问题与 非常接近,但我希望这个略有不同的答案对您有所帮助。
可以通过引入状态变量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。
我有元胞数组:
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 行。我不知道我到底做错了什么,但我不知道还能做什么。
非常感谢您对此提供任何帮助、建议或意见?先感谢您。
这个问题与
可以通过引入状态变量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。