How to copy a sub-matrix/vector along diagonal of a larger matrix with varying number of sub-matrices?
2 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
更多回答(3 个)
Azzi Abdelmalek
2013-3-8
编辑:Azzi Abdelmalek
2013-3-8
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 个评论
Azzi Abdelmalek
2013-3-8
编辑:Azzi Abdelmalek
2013-3-8
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))
Azzi Abdelmalek
2013-3-8
编辑:Azzi Abdelmalek
2013-3-8
n=10
a=[1 2 3]
s= ['@(x1)blkdiag(x1' sprintf(',x%d',ones(1,n-1)) ')']
blkdiagn=str2func(s)
out=blkdiagn(a)
0 个评论
George Papazafeiropoulos
2013-3-8
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
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!