How to copy a sub-matrix/vector along diagonal of a larger matrix with varying number of sub-matrices?

4 visualizaciones (últimos 30 días)
I want to create a matrix below where I copy A = [1 2 3] allow the diagonal of a matrix.
[ 1 2 3 0 0 0 0 0 0 0 0 0
0 0 1 2 3 0 0 0 0 0 0
0 0 0 0 0 0 1 2 3 0 0 0
0 0 0 0 0 0 0 0 0 1 2 3]
I know I can use blkdiag(A ,A, A, A) which will do the job however the number of parameters vary in my code. Sometimes, there may be five A vectors or 20 A vectors that I need to create such a matrix. Let's say this is a variable that the user inputs
How can I do this efficiently in code?
  2 comentarios
John
John el 8 de Mzo. de 2013
If I wanted 5 vectors, it would be blkdiag(A, A, A, A, A) If I wanted 20 vectors, it would be blkdiag(A, A, A, A....A, A, A)
I don't know how many A vectors I need so the input to blkdiag would change each time.

Iniciar sesión para comentar.

Respuesta aceptada

Sean de Wolski
Sean de Wolski el 8 de Mzo. de 2013
You can use comma-separated list expansion to do this automagically:
n = 20;
A = [1 2 3];
Ac = repmat({A},n,1);
blkdiag(Ac{:})

Más respuestas (3)

Azzi Abdelmalek
Azzi Abdelmalek el 8 de Mzo. de 2013
Editada: Azzi Abdelmalek el 8 de Mzo. de 2013
a=[1 2 3]
n=5
d=[a zeros(1,numel(a)*(n-1))]
out=cell2mat(arrayfun(@(x) circshift(d,[0 (n-1)*x]),(0:n-1)','un',0))
EDIT
a=[1 2 3]
n=5
d=[a zeros(1,numel(a)*(n-1))]
out=cell2mat(arrayfun(@(x) circshift(d,[0 numel(a)*x]),(0:n-1)','un',0))
  1 comentario
Azzi Abdelmalek
Azzi Abdelmalek el 8 de Mzo. de 2013
Editada: Azzi Abdelmalek el 8 de Mzo. de 2013
There was an error, check this
n=5 % number of matrices
a=[1 2 3]
d=[a zeros(1,numel(a)*(n-1))]
out=cell2mat(arrayfun(@(x) circshift(d,[0 numel(a)*x]),(0:n-1)','un',0))

Iniciar sesión para comentar.


Azzi Abdelmalek
Azzi Abdelmalek el 8 de Mzo. de 2013
Editada: Azzi Abdelmalek el 8 de Mzo. de 2013
n=10
a=[1 2 3]
s= ['@(x1)blkdiag(x1' sprintf(',x%d',ones(1,n-1)) ')']
blkdiagn=str2func(s)
out=blkdiagn(a)

George Papazafeiropoulos
George Papazafeiropoulos el 8 de Mzo. de 2013
e = ones(n,1);
A = full(spdiags([e 2*e 3*e], 0:2, n, n+2))
A = full(spdiags(A, 0:5, n, n+5))
A = full(spdiags(A, 0:8, n, n+8))
George Papazafeiropoulos

Categorías

Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by