我有一个矩阵:
A = [1 1 1
2 2 2
3 3 3]
有没有矢量化的获取方式:
B = [1 0 0
0 1 0
0 0 1
2 0 0
0 2 0
0 0 2
3 0 0
0 3 0
0 0 3]
最佳答案
A = [1 2 3; 4 5 6; 7 8 9];
A = A.';
B = full(sparse(1:numel(A), repmat(1:size(A,1),1,size(A,2)), A(:)));
原始矩阵在 A
中,我将其转置以便下一步可以正确展开每个矩阵的行。我使用 sparse
来声明矩阵中的非零值。具体来说,我们看到每行只有一个条目,因此行索引的范围应该从 1 到与 A
中的条目一样多。列从 1 到最后一列波动并重复。 mod
当然是通过 thewaywewalk 的解决方案的方式,但我想使用 repmat
以便这是一个独立于他的方法的解决方案。因此,我们创建了一个向量来访问从 1 到我们拥有的尽可能多的列,并且我们对我们拥有的尽可能多的行重复此操作。这些行和列索引向量将决定非零位置出现的位置。最后,将进入每个非零位置的是 A
的元素,它们按照行和列索引向量指定的顺序按行主要顺序展开。
请注意,在repmat
调用中,由于转置操作,调用size
时的行和列被颠倒了。
结果如下,我们得到:
>> B
B =
1 0 0
0 2 0
0 0 3
4 0 0
0 5 0
0 0 6
7 0 0
0 8 0
0 0 9
鉴于上述问题的稀疏性,将矩阵保留为稀疏
形式并在必要时仅使用完整
进行转换可能会更快。在两种格式之间进行转换将花费时间,因此如果您决定进行基准测试,请考虑到这一点。
关于matlab - 如何根据每一行将矩阵转换为一堆对角矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32078436/