簡體   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