creación de matriz vectorizada a partir de una lista de índices de inicio / finalización

Tengo una matriz M dos columnas que contiene los índices de inicio / final de un grupo de intervalos:

 startInd EndInd 1 3 6 10 12 12 15 16 

¿Cómo puedo generar un vector de todos los índices de intervalo?

 v = [1 2 3 6 7 8 9 10 12 15 16]; 

Estoy haciendo lo anterior utilizando ciclos, pero me pregunto si hay una solución vectorizada más elegante.

 v = []; for i=1:size(M,1) v = [v M(i,1):M(i,2)]; end 

Aquí hay una solución vectorizada que me gusta usar para este problema en particular, usando la función cumsum :

 v = zeros(1, max(endInd)+1); % An array of zeroes v(startInd) = 1; % Place 1 at the starts of the intervals v(endInd+1) = v(endInd+1)-1; % Add -1 one index after the ends of the intervals v = find(cumsum(v)); % Perform a cumulative sum and find the nonzero entries 
 cell2mat(arrayfun(@colon,M(:,1)',M(:,2)','UniformOutput',false)) 

No tengo IMFILL, pero en mi máquina este método es más rápido que las otras sugerencias y creo que superaría el método IMFILL debido al uso de find.

Se puede hacer aún más rápido si M se configura transpuesta (y ajustamos los argumentos tercero y cuarto de arrayfun).

Probablemente haya una solución aún mejor que de alguna manera no estoy viendo, pero aquí hay una versión que usa IMFILL

 startInd = [1,6,12,15]; endInd = [3,10,12,16]; %# create a logical vector with starts and ends set to true to prepare for imfill tf = false(endInd(end),1); tf([startInd,endInd]) = true; %# fill at startInd+1 wherever startInd is not equal endInd tf = imfill(tf,startInd(startInd~=endInd)'+1); %' SO formatting %# use find to get the indices v = find(tf)' %' SO formatting v = 1 2 3 6 7 8 9 10 12 15 16 

Solución muy extraña en mi humilde opinión crear cadenas temporales y el uso de EVAL. Puede ser también un trazador de líneas.

 tmp = cellstr(strcat(num2str(M(:,1)),{':'},num2str(M(:,2)),{' '})); v = eval(['[' cell2mat(tmp') ']']); 

Sé que probablemente no funcionará en una matriz grande. Solo por diversión.