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

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

I'm not clear, how would result be different with five vectors or twenty?
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

Más respuestas (3)

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

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.

n=10
a=[1 2 3]
s= ['@(x1)blkdiag(x1' sprintf(',x%d',ones(1,n-1)) ')']
blkdiagn=str2func(s)
out=blkdiagn(a)
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

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by