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
meshgrid
a un vector:b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n);
Construye una matriz que multiplicada por
a
da el resultado:b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).'';
Use
ind2sub
para 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
:
repelem
Replicar elementos de una matriz.
W = repelem(V,N)
, con el vectorV
yN
escalar, crea un vectorW
donde cada elemento deV
se repiteN
veces.
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 .