Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 稀疏矩阵_Matlab_Matrix_Sparse Matrix - Fatal编程技术网

Matlab 稀疏矩阵

Matlab 稀疏矩阵,matlab,matrix,sparse-matrix,Matlab,Matrix,Sparse Matrix,我正在创建一个稀疏矩阵 sp = sparse(I,J,Val,X,Y) 我的Val矩阵是一个1矩阵。令我大吃一惊的是,sp矩阵并不仅仅包含0和1。我认为这是因为在某些情况下,I,J中存在重复项。我的意思是sp(1,1)被设置为12次,这使它成为2 问题1:我的假设正确吗?MATLAB是否真的添加了该值而不是覆盖该值 问题2:考虑到操作I和J会非常麻烦,我们如何绕过这个问题。我能想到的是,使用find(从而保证唯一性),然后再次使用one重新创建矩阵。还有更好的建议吗 问题1:我的假设正确吗?

我正在创建一个稀疏矩阵

sp = sparse(I,J,Val,X,Y)
我的
Val
矩阵是一个1矩阵。令我大吃一惊的是,
sp
矩阵并不仅仅包含0和1。我认为这是因为在某些情况下,
I
J
中存在重复项。我的意思是
sp(1,1)
被设置为12次,这使它成为2

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

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

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


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

如果您确实希望只使用二进制矩阵,那么有两种可能的方法来缓解这种情况

正如您所提到的,操作行和列位置很麻烦,您可能更喜欢的第一种方法是创建您现在拥有的矩阵,但随后将其转换为
逻辑
,以便将任何非零值设置为1:

>> S = S ~= 0

S =

  10×10 sparse logical array

   (6,1)      1
   (5,2)      1
  (10,3)      1
   (9,10)     1
如果您要求矩阵的精度恢复为原来的
双精度
形式,请在转换为
逻辑
后强制转换结果:

>> S = double(S ~= 0)

S =

   (6,1)        1
   (5,2)        1
  (10,3)        1
   (9,10)       1
如果希望,第二种方法是处理行和列位置,以便过滤掉任何非唯一的索引,然后为
val
创建一个
one
向量,该向量与唯一的行和列位置一样长。您可以使用该函数来帮助您做到这一点。将两列矩阵中的行和列位置连接起来,并指定要对
“行”
进行操作。这意味着每一行都被视为一个输入,而不是矩阵中的单个元素。找到唯一的行和列位置后,将其用作创建稀疏矩阵的输入:

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

看来这里没什么可干的了。I,J,X,Y的值是多少?
Val=one(?)
的大小是多少?