【问题标题】:Creating matrix from two vectors of (duplicated) indices in MATLAB在 MATLAB 中从(重复的)索引的两个向量创建矩阵
【发布时间】:2012-09-09 01:15:34
【问题描述】:

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

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

有更快的方法吗?

【问题讨论】:

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

标签: matlab vector matrix


【解决方案1】:

是的。使用稀疏。它为您组装(即求和)重复行列对的矩阵值。您需要一个额外的向量,其中包含将组装到矩阵条目中的值。如果你使用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 中不存在给定行-列对的情况下使用的值。

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 2021-08-08
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多