una secundaria matriz identidad diag crear comando matlab matrix vector diagonal

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 )