secundaria - crear matriz identidad matlab
Cómo repetir un vector a lo largo de una diagonal en Matlab (3)
Porque @mathematician1975 es demasiado flojo para escribir una respuesta adecuada.
Matlab tiene una función para esto, llamada toeplitz
Lo llamarías así:
c=[1;2;3;4;0;0;0];
r=[0, 0, 0, 0];
toeplitz(c,r)
ans =
1 0 0 0
2 1 0 0
3 2 1 0
4 3 2 1
0 4 3 2
0 0 4 3
0 0 0 4
Puedes jugar con los ceros para dar forma a la matriz de la forma que quieras.
Me gustaría repetir un vector A
de longitud n
en una diagonal m
veces para obtener una matriz (n+m-1) xm
B
Como ejemplo, digamos A = [a;b;c;d]
, m = 4
. Esto debería dar como resultado
B =
[a 0 0 0;
b a 0 0;
c b a 0;
d c b a;
0 d c b;
0 0 d c;
0 0 0 d]
¿Alguna sugerencia para una forma rápida de lograr esto? blkdiag(repmat(A,1,m))
no me ayuda en este caso, ya que crea una matriz (n*m) xm
.
Al final, en realidad solo me interesa el producto matriz D
de una tercera matriz C
con B
:
D=C*B
Si ves otra opción para obtener D
sin tener que generar B
, te lo agradecería. ¡Pero una solución para el problema anterior también me haría muy feliz! n
será bastante grande por cierto.
¡Gracias!
La solución total, sin la matriz B
, es hacer la convolución de cada fila de C
con A
puedes hacerlo por for loop:
for k=1:size(C,1)
D(k,:)=conv(C(k,:),A'');
end
D=D(:,length(A)-1:end-length(A)+1); % elliminate the convolution edges
Creo que también se puede hacer sin el bucle, mediante arrayfun
:
k=1:size(C,1);
D=arrayfun(@(x) conv(C(x,:),A''), k);
D=D(:,length(A)-1:end-length(A)+1); % elliminate the convolution edges
Un trazador de líneas torpe, pero genérico
n = 3; %number of elements in A;
m = 5; %repetitions
A = (1:n);
B = full( spdiags( repmat(A(:),1,m)'' , 1-(1:n) , n+m-1, m) )
devoluciones:
B =
1 0 0 0 0
2 1 0 0 0
3 2 1 0 0
0 3 2 1 0
0 0 3 2 1
0 0 0 3 2
0 0 0 0 3
Alternativamente una versión genérica mejorada de la solución de rubenvb
B = toeplitz( [A(:);zeros(m-1,1)] , zeros(1,m) )
en ambos casos, A
puede ser un vector de fila o columna.
¡La solución más rápida (factor 2x) es la primera con spdiags
!
Editar: incluso más torpe, pero hasta 10 veces más rápido (depende de n, m) que el toeplitz
toeplitz:
B = reshape( [repmat([A(:);zeros(m,1)],m-1,1) ; A3(:)] ,[],m )