una - Insertar número variable de ceros entre elementos distintos de cero en un vector en MATLAB
matriz identidad en matlab (3)
Tengo un vector como:
a = [1,2,3,4,5,6...,n]
y me gustaría obtener un nuevo vector como este:
a_new = [1,0,0,2,0,0,3,0,0,4,0,0,5,0,0,6,...,0,0,n]
donde se inserta un número fijo de ceros (2 en el ejemplo anterior) entre los elementos distintos de cero. Si elijo zero_p=3
, el nuevo vector sería:
a_new = [1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,...,0,0,0,n]
etc.
¿Cómo puedo hacer esto?
Hay algunas maneras en que puedo pensar:
Producto Kronecker
El producto kronecker es excelente para esto. En Matlab, kron
es lo que estás buscando:
a = 1:4;
a = kron(a, [1 0 0])
ans =
1 0 0 2 0 0 3 0 0 4 0 0
o, generalizado,
a = 1:4;
zero_p = 3;
b = [1 zeros(1,zero_p-1)];
a = kron(a, b)
ans =
1 0 0 2 0 0 3 0 0 4 0 0
Si desea que termine con un elemento distinto de cero, debe hacer un paso adicional:
a = a(1:end-zero_p);
O, si te gustan las frases ingeniosas, todo se puede hacer así:
a = 1:4;
zero_p = 3;
a = [kron(a(1:end-1), [1 zeros(1,zero_p-1)]), a(end)]
ans =
1 0 0 2 0 0 3 0 0 4
Relleno cero
Probablemente el método más simple y el mejor rendimiento:
a = 1:4;
zero_p = 3;
a = [a; zeros(zero_p, size(a, 2))];
a = a(1:end-zero_p);
Multiplicación de matriz
También es sencillo, fácil de leer y de gran rendimiento, aunque podría ser excesivo para muchas situaciones distintas de este escenario en particular:
a = 1:4;
b = [1; zeros(zero_p, 1)];
a = b*a;
a = a(1:end-zero_p);
Prueba esto:
zero_p=3;
a_new=zeros(1, (zero_p+1)*length(a)-zero_p);
a_new(1:(zero_p+1):end)=a;
(No probado, pero debería funcionar).
x = [1 2 3 4 5]; upsample (x, 3)
o / p: 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0
¡¡Aclamaciones!!