Contiguous Number Checking and Verification
    3 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
Suppose, I have a variable, a.
a={             18  5   1   3
          14  2   1   2 
          4   2   5   9
          2   1   5   7
                 1   5   6   7
          3   3   6   1
          3   7   6   5
          16  6   6   3
                 5   3   6   6};
Based on column 3 value, I would like to check whether the values in COLUMN 4 are contiguous or not. The eg below is elaborated to clarify my goal.
Column 3 contains unique values of 1,5 and 6:
18  5   1   3
14  2   1   2
-  The values in column 4 are contiguous  
4   2   5   9
2   1   5   7
-  The values in column 4 are NOT contiguous. (Missing '8' in Col 4)
1   5   6   7
3   3   6   1
3   7   6   5
16  6   6   3
5   3   6   6
-  The values in column 4 are NOT contiguous. (Missing '2','4' in Col 4)
Result: [0 1 2]
How can I perform this complex computation? Ideally, the results should be stored using just 1 variable (if possible). My code at the moment is way too complicated and not efficient. Any help would be greatly appreciated.
3 comentarios
  dpb
      
      
 el 9 de Jul. de 2013
				OK, you gave an example of what is/isn't contiguous; that helps.
But, you still haven't shown what is the specific output -- is it just a logical in which case the answer would be [1 0 0]'? Or something else?
Have to have a precise working definition to implement a solution. The general idea outlined previously works; accumarray() likely is your friend here.
Respuesta aceptada
  dpb
      
      
 el 10 de Jul. de 2013
        
      Editada: dpb
      
      
 el 10 de Jul. de 2013
  
      OK, just change the function slightly...
MATL
>> [~,~,c] = unique(a(:,3));
>> nmiss=accumarray(c,a(:,4),[],@(x) length([min(x):max(x)])-length(x))
nmiss =
   0
   1
   2
>>
And, to anticipate the next wishes/needs (*) ...
MATL
>> [u,~,c] = unique(a(:,3));
>> groups = accumarray(c,a(:,4), [length(u) 1], @(x) {x})
groups = 
  [2x1 double]
  [2x1 double]
  [5x1 double]
>> groups{:}
ans =
   3
   2
ans =
   9
   7
ans =
   7
   1
   5
   3
   6
>> missing = accumarray(c,a(:,4), [length(u) 1], ...
                       @(x) {setdiff(min(x):max(x), x)})
missing = 
  [1x0 double]
  [         8]
  [1x2 double]
>> missing{:}
ans =
 Empty matrix: 1-by-0
ans =
   8
ans =
   2     4
>>
(*) And credit to Kelly Kearney at cs-sm who showed the "trick" to getting the SZ argument correct for the cell array addressing for the last two. Thanks, Kelly!!! :)
1 comentario
Más respuestas (1)
  dpb
      
      
 el 9 de Jul. de 2013
        Given the input a, the first case of returning a logical array of groups that are/aren't contiguous...
MATL
>> [u,~,c] = unique(a(:,3));
>> lcontig=accumarray(c,a(:,4),[],@(x) all(abs(diff(x))==1))
lcontig =
   1
   0
   0
>>
Again, need more definition to know what you're actually after but should give you some ideas...
0 comentarios
Ver también
Categorías
				Más información sobre Logical en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

