[英]sparse matrix matlab unexpected behavior
我正在創建一個稀疏矩陣
sp = sparse(I,J,Val,X,Y)
我的Val
矩陣是一個矩陣。 令我驚訝的是, sp
矩陣不僅包含0和1。 我想這是因為在某些情況下I
, J
有重復。 我的意思是sp(1,1)
設置為1 2次,這使它成為2。
問題1:我的假設是正確的嗎? MATLAB真的添加它而不是覆蓋這個值嗎?
問題2:我們如何解決這個問題,因為操縱I
和J
會非常麻煩。 我能想到的是使用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
如果你願意的第二種方法是在你的行和列的位置,這樣您過濾掉非唯一索引的任何,然后創建的矢量ones
為val
即只要獨特的行和列的位置。 您可以使用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.