matlab - 如何根据每一行将矩阵转换为一堆对角矩阵?

标签 matlab matrix vectorization

我有一个矩阵:

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]

最佳答案

这是使用 sparse 的另一种方式和 repmat :

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/

相关文章:

matlab - 预先计算多维线性插值的权重

matlab - Matlab求解方程中多变量的顺序

c - 如何在汇编中遍历矩阵?

r - 我有一个稀疏矩阵,当我在 R 中打开它时,所有应该为 0 的元素都是像 ' . ' 这样的点,如何将这个点转换为数字 0?

python - 使用两个数据框进行 Pandas 矢量化

matlab - 在 MATLAB 中创建与 classperf 一起使用的分类器

python:numpy函数扩展多个矩阵

matlab - 向量化连续幂矩阵的创建

arrays - 从索引数组创建二进制矩阵

matlab - 三角剖分和直接线性变换