创建对角矩阵(更高维度)

时间:2013-02-11 03:14:27

标签: matlab

我有一个n * m矩阵,比如A。我想创建以下m * m * n矩阵,比如B

for j=1:n
    B(:,:,j)=diag(A(j,:));
end

如何在不必循环的情况下执行此操作?

由于

1 个答案:

答案 0 :(得分:4)

更新:我已编辑问题以修复示例代码中的拼写错误。

我很确定你的示例代码包含一些拼写错误,因为目前矩阵A没有用处,循环下标j也没有用。但是,您实际上想要问的问题似乎很可能是:如何构建一个3d数组,其中每个对角线(沿第三维移动)是A的一行,而不进行循环?

如果这是正确的,那么一个答案如下:

%# A loop-less solution
Soln2 = zeros(M, M, N);
Soln2(bsxfun(@plus, (1:M+1:M*M)', (0:M^2:(N-1)*M^2))) = A';

基本上我所做的就是预先分配解决方案3d数组,然后使用bsxfun构建所有对角线的线性索引,沿第3维移动。然后我将A的转置(因为你想要行而不是列)分配给解决方案数组中的线性索引。

注意,我已经粘贴了一些示例代码用于测试目的。请确认我对基于循环的解决方案的解释是您真正想要的。

%# Set some parameters and create a random matrix A
N = 3;
M = 4;
A = randi(5, N, M);

%# Your loop based solution
Soln1 = nan(M, M, N);
for n = 1:N
    Soln1(:,:,n) = diag(A(n,:));
end

%# A loop-less solution
Soln2 = zeros(M, M, N);
Soln2(bsxfun(@plus, (1:M+1:M*M)', (0:M^2:(N-1)*M^2))) = A';