【问题标题】:sparse matrix matlab unexpected behavior稀疏矩阵matlab意外行为
【发布时间】:2017-06-11 01:19:24
【问题描述】:

我正在创建一个稀疏矩阵

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

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

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

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

【问题讨论】:

  • 看来这里没什么可做的了。 I、J、X、Y 的值是多少? Val = ones(?) 的大小是多少?

标签: matlab matrix sparse-matrix


【解决方案1】:

问题 1:我的假设是真的吗?不是覆盖值,而是Matlab真的加了吗?

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

This is clearly seen in the documentation 但作为一个可重现的示例,假设我在这些位置具有以下行和列位置及其关联值:

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) 的三个值相加:100 + 202 + 173 = 475。您可以使用其他重复的行和列位置来验证这一点。


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

如果您确实希望只有一个二进制矩阵,有两种可能的方法可以缓解这种情况。

第一种方法可能对您更可取,因为您提到操作行和列位置很麻烦,是创建您现在拥有的矩阵,然后将其转换为 logical 以便任何非-zero 设置为 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

如果您愿意,第二种方法是处理行和列位置,以便过滤掉任何非唯一索引,然后为 val 创建一个 ones 向量,该向量与唯一索引一样长行和列位置。您可以使用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

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 2013-04-11
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2022-08-18
    • 2018-01-19
    相关资源
    最近更新 更多