我感兴趣的是如何创建一个从矩阵阵列的对角矩阵。 我创建矩阵的阵列在MATLAB:
X<62x62x1000>
它包括1000点矩阵尺寸为62x62
我想创建尺寸62000x62000的矩阵与来自阵列X 1000点的子矩阵沿主对角线。
你有任何线索如何做到这一点,除了M=blkdiag(X(:,:,1), X(:,:,2), X(:,:,3)...)
因为这将是多写。
我感兴趣的是如何创建一个从矩阵阵列的对角矩阵。 我创建矩阵的阵列在MATLAB:
X<62x62x1000>
它包括1000点矩阵尺寸为62x62
我想创建尺寸62000x62000的矩阵与来自阵列X 1000点的子矩阵沿主对角线。
你有任何线索如何做到这一点,除了M=blkdiag(X(:,:,1), X(:,:,2), X(:,:,3)...)
因为这将是多写。
一个可能的解决方案
M = kron(speye(1000),ones(62));
M(logical(M)) = X(:);
与kron
一个62000 * 62000稀疏矩阵M
创建包含在其对角线上的人的1000个块,然后用元件更换那些X
。
您可以通过扁平化的输入矩阵为列向量(:)
索引,然后将它传递给diag
以沿对角线一个新的矩阵的这些元素。
result = diag(X(:))
这将在命令列主顺序(默认为MATLAB)沿对角线的元素。 如果你想要一个不同的排序,你可以用permute
来之前压扁重新排序的尺寸。
请注意,您得到的矩阵将是相当大的这一点很重要。 你可以使用spdiags
,而不是创建一个稀疏对角矩阵
spdiags(X(:), 0, numel(X), numel(X))
一个很有争议的eval调用可以解决这个问题很懒惰,但我怀疑有一个更好的方法来做到这一点:
evalstring = ['M=blkdiag('];
for i = 1:999
evalstring = [evalstring, 'X(:,:,', num2str(i),'),'];
end
evalstring = [evalstring, 'X(:,:,1000));'];
eval(evalstring);