arrays - una - Replicación de matriz de elementos en Matlab
suma de elementos de un vector matlab (7)
Digamos que tengo una matriz unidimensional:
a = [1, 2, 3];
¿Hay una función incorporada de Matlab que toma una matriz y un entero n y replica cada elemento de la matriz n veces?
Por ejemplo, llamar a replicate(a, 3) debería devolver [1,1,1,2,2,2,3,3,3] .
Tenga en cuenta que esto no es en absoluto lo mismo que repmat . Ciertamente puedo implementar replicate haciendo repmat en cada elemento y concatenando el resultado, pero me pregunto si hay una función incorporada que sea más eficiente.
a = [1 2 3];
N = 3;
b = reshape(repmat(a,N,1), 1, [])
Si tiene la caja de herramientas de procesamiento de imágenes, hay otra alternativa:
N = 3;
imresize(a, [1 N*numel(a)],''nearest'')
% To get b = [1 1 1 2 2 2 3 3 3]
N = 3;
a = [1 2 3];
temp_a = a(ones(N,1),:);
b = reshape(temp_a,1,numel(temp_a));
% To get b = [1 2 3 1 2 3 1 2 3]
N = 3;
a = [1 2 3];
temp_a = a(ones(N,1),:);
b = reshape(temp_a'',1,numel(temp_a));
>> n=3;
>> a(floor((0:size(a,2)*n-1)/n)+1)
ans =
1 1 1 2 2 2 3 3 3
Algunas alternativas exóticas Es cierto que es más divertido que útil:
Asigna el (primer) resultado de
meshgrida un vector:b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n);Construye una matriz que multiplicada por
ada el resultado:b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).'';Use
ind2subpara generar los índices:[~, ind] = ind2sub([n 1],1:numel(a)*n); b = a(ind);
Soy un fanático de la función KRON :
>> a = 1:3;
>> N = 3;
>> b = kron(a,ones(1,N))
b =
1 1 1 2 2 2 3 3 3
También puede ver esta pregunta relacionada (que trata sobre la replicación de elementos de matrices en 2D) para ver algunas de las otras soluciones que involucran la indexación matricial. Aquí hay una de esas soluciones (inspirada en la respuesta de Edric ):
>> b = a(ceil((1:N*numel(a))/N))
b =
1 1 1 2 2 2 3 3 3
A partir de R2015a , hay una función incorporada y documentada para hacer esto, repelem :
repelemReplicar elementos de una matriz.
W = repelem(V,N), con el vectorVyNescalar, crea un vectorWdonde cada elemento deVse repiteNveces.
El segundo argumento también puede ser un vector de la misma longitud que V para especificar el número de repeticiones para cada elemento. Para la replicación 2D:
B = repelem(A,N1,N2)
Ya no necesitas kron u otros trucos.
ACTUALIZACIÓN: Para una comparación de rendimiento con otros métodos rápidos, consulte la sección Preguntas y respuestas Repita las copias de los elementos de la matriz: Descodificación de longitud de ejecución en MATLAB .