【问题标题】:Find a value in a range of values在一系列值中查找一个值
【发布时间】:2014-04-22 20:45:29
【问题描述】:
我有 72 次试验的数据,有些试验可用,有些则不能。试验的开始和结束由两个单元格“First_scans”(即试验的第一次扫描)和“Last_scans”(试验的最后一次扫描)指定。因此,First_scans 是一个 72x1 单元格(值为 1、15、25强>、46 等)。 Last_scan 也是一个 72x1 单元格(值为 10、23、38 > 等)。试验有不同的长度并且不是连续的。现在,我有另一个名为 Bad_scans 的单元格,其中包含不可用的扫描。这是一个 nx1 单元格,具有 14、15、16、26 等值>、38 等。由于试验不是连续的,一些 bad_scans 可能不是试验的一部分。
考虑到所有这些,我想找出下面这些 bad_scans 属于哪些试验(如果它们确实属于试验)。如果 bad_scan 介于该试验的开始和结束扫描之间,则它属于该试验。例如,按照前面的示例,扫描 14 不属于任何试验。第二个和第三个bad_scans分别是15和16,属于试验2。第四个 bad_scan 属于第三次试验。如何获得包含 bad_scans 的试验的摘要?
谢谢!
【问题讨论】:
标签:
matlab
indexing
match
【解决方案1】:
这里有些东西可能会有所帮助;为了论证,我使用长度 3 而不是 72:
first_scans={1;2;9};
last_scans={3;4;5};
bad_scans={4;7};
fs=cell2mat(first_scans);
ls=cell2mat(last_scans);
bs=cell2mat(bad_scans);
trials=cat(2,fs,ls);
bad_trials=zeros(0,0);
for i=1:size(trials,1)
if any(ismember(bs,trials(i,:)))
bad_trials=cat(2,bad_trials,i);
end
end
disp(bad_trials)
【解决方案2】:
尝试以下操作:循环遍历每对开始/结束值,并确定是否有任何值出现在错误扫描列表中。可以以牺牲清晰度为代价将其编写为“矢量化”方法 - 仅 72 次扫描,性能损失不值得编写难以理解的代码的麻烦。
bad_runs = cell(1,72);
containsBad = zeros(1,72);
bad_scans = cell2array(bad_scans);
for ii = 1:72
temp = First_scans{ii}:Last_scans{ii};
containsBad = (numel(intersect(temp, bad_scans))>0);
end
所有包含错误扫描的摘要:
disp(find(containsBad));
【解决方案3】:
假设:
First_scans = {1; 15; 25; 46}
Last_scan = {10; 23; 38; 50}
Bad_scans = {14; 15; 16; 26; 38}
你可以这样做:
find(arrayfun(@(x) any(First_scans{x} <= [Bad_scans{:}] & Last_scan{x} >= [Bad_scans{:}]), 1:numel(First_scans)))
ans =
2 3
这意味着试验 2 和 3 包含错误扫描。