假设现在我有两个相同长度的向量:
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)}
有更快的方法吗?
答案 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参数传递给accumarrayAA=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中不存在给定行 - 列对的情况下使用的值。