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

在MATLAB中由两个(重复)索引向量创建矩阵,matlab,vector,matrix,Matlab,Vector,Matrix,假设现在我有两个长度相同的向量: A = [1 2 2 1]; B = [2 1 2 2]; 我想创建一个矩阵C,它的dim=m*n,m=maxA,n=maxB 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中的行和列,Cu,v是{k | Ai=u和Bi=v,i=1,2,…,leng

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

A = [1 2 2 1];
B = [2 1 2 2];
我想创建一个矩阵C,它的dim=m*n,m=maxA,n=maxB

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中的行和列,Cu,v是{k | Ai=u和Bi=v,i=1,2,…,lengthA}中元素的数量


有更快的方法吗?

有。使用稀疏。它为您组装,即,为重复的行-列对汇总矩阵值。您需要一个附加的向量,其中的值将被组合到矩阵条目中。如果您使用onessizeA,您将获得您所需要的—重复行-列对计数

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,使用汇编和0作为填充值,即在a/B中不存在给定行-列对的情况下使用的值。

是。使用稀疏。它为您组装,即,为重复的行-列对汇总矩阵值。您需要一个附加的向量,其中的值将被组合到矩阵条目中。如果您使用onessizeA,您将获得您所需要的—重复行-列对计数

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,使用汇编和0作为填充值,即在a/B中不存在给定行-列对的情况下使用的值。

c应为[0 2;1 1],而不是您建议的[0 2 0;1 1 0]。您的代码输出为[0 2;1 1]。@nrz已编辑,很抱歉。c应为[0 2;1 1],而不是您建议的[0 2 0;1 1 1 0]。您的代码输出为[0 2;1 1]。@nrz已编辑,很抱歉。