1

假设现在我有两个相同长度的向量:

A = [1 2 2 1];
B = [2 1 2 2];

我想创建一个矩阵 C,其 dim=m*n,m=max(A),n=max(B)。

C = zeros(m,n);
for i = 1:length(A)
   u = A(i);
   v = B(i);
   C(u,v)=C(u,v)+1;
end

并得到

C =[0 2;
    1 1]

更准确地说,我们将 A 和 B 中的相应索引视为 C 中的行和列,而 C(u,v) 是 {k | A(i)=u 和 B(i)=v, i = 1,2,...,length(A)}

有没有更快的方法来做到这一点?

4

1 回答 1

4

是的。使用稀疏。它为您组装(即总结)重复行列对的矩阵值。您需要一个额外的向量,其中包含将组装到矩阵条目中的值。如果你使用ones(size(A)),你将得到你所需要的——重复行列对的计数

spA=sparse(A, B, ones(size(A)));
full(spA)

ans =

 0     2
 1     1

同样可以通过简单地将标量 1 传递给稀疏函数而不是值向量来获得。

对于具有大量零条目的矩阵,使用稀疏存储绝对至关重要。您可以使用的另一个函数是 accumarray。它基本上可以做同样的事情,但也适用于密集矩阵结构:

AA=accumarray([A;B]', 1);

AA =

 0     2
 1     1

如果要创建特定大小的矩阵,可以将 size 参数传递给 accumarray

AA=accumarray([A;B]', 1, [2 3]);
AA =

 0     2     0
 1     1     0

请注意,您实际上也可以使其生成稀疏矩阵,并在汇编中使用不同的运算符(即,不一定是总和)

AA=accumarray([A;B]', 1, [2 3], @sum, 0, true)

将生成一个稀疏矩阵(最后一个参数设置为 true),使用 sum 进行组装,并将 0 作为填充值,即在 A/B 中不存在给定行列对的情况下使用的值。

于 2012-09-16T18:08:59.600 回答