在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已编辑,很抱歉。