在MATLAB中从两个(重复)索引向量创建矩阵

时间:2012-09-16 16:56:14

标签: matlab vector matrix

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

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)}

有更快的方法吗?

1 个答案:

答案 0 :(得分:4)

是。使用稀疏。它汇总(即总结)用于重复行 - 列对的矩阵值。您需要一个额外的向量,其值将组合到矩阵条目中。如果你使用(大小(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)

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