我有 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 的摘要?
谢谢!
答案 0 :(得分:0)
这可能会有所帮助;为了论证,我使用长度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)
答案 1 :(得分:0)
尝试以下操作:此循环遍历每对开始/结束值,并确定是否在错误扫描列表中出现任何值。可以将此作为“矢量化”方法编写,但代价是清晰度 - 只需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));
答案 2 :(得分:0)
假设:
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
包含错误扫描。