Как проверить, что значения диапазона содержатся в любом другом значении диапазона в MATLAB? - PullRequest
2 голосов
/ 08 апреля 2020

Я пытаюсь проверить, если в двух векторах, имеющих несколько записей, содержащих пару диапазонов, является ли диапазон из одного вектора частью другого диапазона?

У меня есть один вектор тестового диапазона, который содержит пару записей такие как: tr = [99 143]; Записи могут быть более одной пары также. Я пытаюсь проверить, является ли этот диапазон поддиапазоном любой из парных записей из другого вектора, например, v = [9 79 97 190 205 278 293 304];

Я использую платформу MATLAB. Ответ из приведенного выше примера должен быть 97-190.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Вот векторизованный способ, использующий логические сравнения с неявным расширением , find и accumarray.

Давайте рассмотрим более общий пример, где некоторые диапазоны в tr не появляются в v или появляются более одного раза:

tr = [99 143 10 20 40 99];
v = [9 79 97 190 205 278 293 304 99 143];

Тогда

c = (tr(1:2:end) >= v(1:2:end).') & (tr(2:2:end) <= v(2:2:end).'); % subrange conditions
[ii, jj] = find(c); % row and column indices of true entries
result = accumarray(jj, ii, [numel(tr)/2 1], @(t){v([2*t-1 2*t])}); % build result

дает

>> celldisp(result)
result{1} =
    97   190
    99   143
result{2} =
     9    79
result{3} =
     []

означает, что первый диапазон в tr (99 143) содержится в двух диапазонах в v (97 190 и 99 143), второй в одном, третий в нуле.

0 голосов
/ 08 апреля 2020

Это код, который я пробовал. Это дает правильные результаты на этом тестовом наборе.

 tr=[99 143];
 v=[9 79 97 190 205 278 293 304];
 for i=1:2:length(tr)
     for j=1:2:length(v)
      if(tr(i)>=v(j) && tr(i+1) <=v(j+1))    
        display('yes');
        tr(i) 
        tr(i+1)
        v(j)
        v(j+1)
       end 
     end
 end

Ждем более эффективного ответа, чем этот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...