繁体   English   中英

稀疏矩阵matlab意外行为

[英]sparse matrix matlab unexpected behavior

我正在创建一个稀疏矩阵

sp = sparse(I,J,Val,X,Y)

我的Val矩阵是一个矩阵。 令我惊讶的是, sp矩阵不仅包含0和1。 我想这是因为在某些情况下IJ有重复。 我的意思是sp(1,1)设置为1 2次,这使它成为2。

问题1:我的假设是正确的吗? MATLAB真的添加它而不是覆盖这个值吗?

问题2:我们如何解决这个问题,因为操纵IJ会非常麻烦。 我能想到的是使用find(从而保证唯一性),然后再使用它重新创建矩阵。 还有更好的建议吗?

问题1:我的假设是正确的吗? Matlab是否真的添加了它而不是覆盖该值?

正确。 如果您有重复的行和列值,每个值都有自己的值,MATLAB将通过添加它们将它们全部聚合到相同的行和列位置。

这在文档中可以清楚地看到,但作为一个可重现的示例,假设我在这些位置具有以下行和列位置及其关联值:

i = [6 6 6 5 10 10 9 9].';
j = [1 1 1 2 3 3 10 10].';
v = [100 202 173 305 410 550 323 121].';

请注意,这些是列向量,因为此形状是预期输入。 在一个更简洁的演示文稿:

>> [i j v]

ans =

     6     1   100
     6     1   202
     6     1   173
     5     2   305
    10     3   410
    10     3   550
     9    10   323
     9    10   121

我们可以看到有三个值被映射到位置(6, 1) ,两个值被映射到位置(10, 3) ,最后两个被映射到位置(9, 10)

通过创建稀疏矩阵并显示它,我们得到:

>> S = sparse(i,j,v)

S =

   (6,1)      475
   (5,2)      305
  (10,3)      960
   (9,10)     444

如您所见,映射到(6, 1) 6,1 (6, 1)的三个值相加:100 + 202 + 173 = 475.您可以使用其他重复的行和列位置对此进行验证。


问题2:我们如何解决这个问题,因为操纵I和J会非常麻烦。我能想到的是使用find(从而保证唯一性),然后再使用它重新创建矩阵。 还有更好的建议吗?

如果确实只需要二进制矩阵,那么有两种方法可以缓解这个问题。

当你提到操作行和列位置时,第一种可能比你更优选的方法是创建你现在拥有的矩阵,然后将其转换为logical以便将任何非零值设置为1:

>> S = S ~= 0

S =

  10×10 sparse logical array

   (6,1)      1
   (5,2)      1
  (10,3)      1
   (9,10)     1

如果您要求矩阵的精度返回其原始的double精度形式,请在转换为logical后转换结果:

>> S = double(S ~= 0)

S =

   (6,1)        1
   (5,2)        1
  (10,3)        1
   (9,10)       1

如果你愿意的第二种方法是在你的行和列的位置,这样您过滤掉非唯一索引的任何,然后创建的矢量onesval即只要独特的行和列的位置。 您可以使用unique功能来帮助您实现这一目标。 在两列矩阵中连接行和列位置,并指定您要对'rows'进行操作。 这意味着每行被视为输入而不是矩阵中的单个元素。 找到唯一的行和列位置后,使用这些作为输入来创建稀疏矩阵:

>> unique_vals = unique([i j], 'rows')

unique_vals =

     5     2
     6     1
     9    10
    10     3

>> vals = ones(size(unique_vals, 1));
>> S = sparse(unique_vals(:, 1), unique_vals(:, 2), vals)

S =

   (6,1)        1
   (5,2)        1
  (10,3)        1
   (9,10)       1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM