【问题标题】:Find a value in a range of values在一系列值中查找一个值
【发布时间】:2014-04-22 20:45:29
【问题描述】:

我有 72 次试验的数据,有些试验可用,有些则不能。试验的开始和结束由两个单元格“First_scans”(即试验的第一次扫描)和“Last_scans”(试验的最后一次扫描)指定。因此,First_scans 是一个 72x1 单元格(值为 11525强>、46 等)。 Last_scan 也是一个 72x1 单元格(值为 102338 > 等)。试验有不同的长度并且不是连续的。现在,我有另一个名为 Bad_scans 的单元格,其中包含不可用的扫描。这是一个 nx1 单元格,具有 14151626 等值>、38 等。由于试验不是连续的,一些 bad_scans 可能不是试验的一部分。

考虑到所有这些,我想找出下面这些 bad_scans 属于哪些试验(如果它们确实属于试验)。如果 bad_scan 介于该试验的开始和结束扫描之间,则它属于该试验。例如,按照前面的示例,扫描 14 不属于任何试验。第二个和第三个bad_scans分别是1516,属于试验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
      

      这意味着试验 23 包含错误扫描。

      【讨论】:

        猜你喜欢
        • 2019-01-08
        • 1970-01-01
        • 2014-09-04
        • 2018-07-02
        • 2022-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-01
        相关资源
        最近更新 更多