superponer - Repetición de matriz de elementos en MATLAB
rango ejes matlab (1)
Para R2015a y más nuevo ...
De acuerdo con la documentación para repelem
(presentada por primera vez en la versión R2015a), también puede operar en matrices. Creo que el siguiente código debería lograr lo que desea (no puedo probarlo porque tengo una versión anterior):
newMat = repelem(mat, 1, 1, [3 2 1 1 5 4 2 2 1]);
Para versiones anteriores a R2015a ...
Puede usar uno de los enfoques de esta pregunta para replicar un índice en la tercera dimensión, luego simplemente indexe su matriz con eso. Por ejemplo (adaptando la solución de Divakar ):
vals = 1:size(mat, 3);
clens = cumsum([3 2 1 1 5 4 2 2 1]);
index = zeros(1, clens(end));
index([1 clens(1:end-1)+1]) = diff([0 vals]);
newMat = mat(:, :, cumsum(index));
A continuación, puede generalizar esto en una función para operar en múltiples dimensiones como repelem
:
function A = my_repelem(A, varargin)
index = cell(1, nargin-1);
for iDim = 1:nargin-1
lens = varargin{iDim};
if isscalar(lens)
if (lens == 1)
index{iDim} = '':'';
continue
else
lens = repmat(lens, 1, size(A, iDim));
end
end
vals = 1:size(A, iDim);
clens = cumsum(lens);
index{iDim} = zeros(1, clens(end));
index{iDim}([1 clens(1:end-1)+1]) = diff([0 vals]);
index{iDim} = cumsum(index{iDim});
end
A = A(index{:});
end
Y para su muestra de datos, la usaría así:
>> A(:,:,1) = [1 2; 1 2];
>> A(:,:,2) = [2 3; 2 3];
>> A = my_repelem(A, 1, 1, [1 2])
A(:,:,1) =
1 2
1 2
A(:,:,2) =
2 3
2 3
A(:,:,3) =
2 3
2 3
Tengo una matriz tridimensional. Quiero replicar la matriz de tamaño 8x2x9 a un número específico de veces en la tercera dimensión dada por un vector decir [3, 2, 1, 1, 5, 4, 2, 2, 1]
para que la matriz resultante sea de tamaño 8x2x21. ¿Hay alguna función incorporada de MATLAB (estoy ejecutando la versión 2014a) para hacer esto similar a la función repelem
más repelem
, para matrices?
Un simple ejemplo de lo que necesito:
% Input:
A(:,:,1) = [1 2; 1 2];
A(:,:,2) = [2 3; 2 3];
% Function call:
A = callingfunction(A, 1, 1, [1 2]);
% Output:
A(:,:,1) = [1 2; 1 2];
A(:,:,2) = [2 3; 2 3];
A(:,:,3) = [2 3; 2 3];