Element-sabia replicación matriz en Matlab
-
21-09-2019 - |
Pregunta
Vamos a decir que tengo una matriz unidimensional:
a = [1, 2, 3];
¿Hay una función integrada de Matlab que toma una matriz y un n
número entero y se replica cada
elemento de las veces matriz n?
Por ejemplo llamando replicate(a, 3)
debe 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 aplicar replicate
haciendo repmat
en cada elemento y concatenando el resultado, pero estoy preguntando si hay una función integrada que es más eficiente.
Solución
A partir de R2015a , hay una de construcción -en función y documentado para hacer esto, repelem
:
repelem
Replicar elementos de una matriz.
W = repelem(V,N)
, conV
vector yN
escalar, crea unaW
vector donde cada elemento deV
se repite vecesN
.
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)
No hay necesidad de kron
u otros trucos más!
ACTUALIZACIÓN: Para una comparación de rendimiento con otros métodos rápidos, por favor ver el Q & A Repetir las copias de los elementos de la matriz :.-Run de decodificación de longitud en MATLAB
Otros consejos
Soy un fan de la Kron función:
>> a = 1:3;
>> N = 3;
>> b = kron(a,ones(1,N))
b =
1 1 1 2 2 2 3 3 3
También puede buscar en esta pregunta relacionado (que se ocupa de elementos de replicación de matrices 2-D) para ver algunas de las otras soluciones que implican la indexación matriz. Aquí está una tal solución (inspirado por de Edric respuesta):
>> b = a(ceil((1:N*numel(a))/N))
b =
1 1 1 2 2 2 3 3 3
a = [1 2 3];
N = 3;
b = reshape(repmat(a,N,1), 1, [])
>> 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. Sin duda más divertido que útil:
-
Asignar la (primera) resultado de
meshgrid
a un vector:b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n);
-
Construir una matriz que multiplica por
a
da el resultado:b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).';
-
Uso
ind2sub
para generar los índices:[~, ind] = ind2sub([n 1],1:numel(a)*n); b = a(ind);
Si usted tiene la caja de herramientas de procesamiento de imágenes, no 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));