如何向量化矩阵的行方式对角化(How to vectorize row-wise diagonali

2019-07-29 22:41发布

我有一个n乘M矩阵,我想转换为MN-m矩阵,用含有对角线每行的结果的每个m乘米块。

例如,如果输入是:

[1 2; 3 4; 5 6]

输出应该是:

[1 0; 0 2; 3 0; 0 4; 5 0; 0 6]

当然,我并不想组装用一个步骤自己的矩阵步骤for循环。
是否有一个量化的和简单的方式来实现这一目标?

Answer 1:

用于向量化的方法来做到这一点,创建对角元素的线性索引到所得到的矩阵,并直接分配。

%# create some input data
inArray = [10 11;12 13;14 15];

%# make the index array
[nr,nc]=size(inArray);

idxArray = reshape(1:nr*nc,nc,nr)';
idxArray = bsxfun(@plus,idxArray,0:nr*nc:nr*nc^2-1);

%# create output
out = zeros(nr*nc,nc);
out(idxArray) = inArray(:);

out =

    10     0
     0    11
    12     0
     0    13
    14     0
     0    15


Answer 2:

下面是一个简单的向量化溶液,假设X是输入矩阵:

Y = repmat(eye(size(X, 2)), size(X, 1), 1);
Y(find(Y)) = X;

另一种替代方法是使用sparse ,这可以写为一个整洁的一行程序:

Y = full(sparse(1:numel(X), repmat(1:size(X, 2), 1, size(X, 1)), X'));


Answer 3:

我认为要做到这一点最简单的方法其实很简单,用简单的索引引用和重塑功能:

I = [1 2; 3 4; 5 6];
J(:,[1,4]) = I;
K = reshape(J',2,6)';

如果您检查J ,它看起来像这样:

J =
     1     0     0     2
     3     0     0     4
     5     0     0     6

矩阵K正是想要的东西:

K =
     1     0
     0     2
     3     0
     0     4
     5     0
     0     6

如埃坦T IN的评论所指出的,以上是特定于实施例,并且不覆盖一般解。 所以下面是一般的解决方案,m和n如在问题说明。

J(:,1:(m+1):m^2) = I;
K=reshape(J',m,m*n)';

如果你想进行测试,看看它的工作,只是使用

I=reshape(1:(m*n),m,n)';

注意:如果j已经存在,这可能会导致问题。 在这种情况下,你也需要使用

J=zeros(n,m^2);


Answer 4:

它可能不是最高效计算的解决方案,但这里有一个1,内胆采用kron

A = [1 2; 3 4; 5 6];
B = diag(reshape(A', 6, 1) * kron(ones(3, 1), eye(2))
% B = 
%     1     0
%     0     2
%     3     0
%     0     4
%     5     0
%     0     6

这可如果A是n×m的概括:

diag(reshape(A.', n*m, 1)) * kron(ones(n,1), eye(m))


文章来源: How to vectorize row-wise diagonalization of a matrix