类似稀疏结构之间的差异

时间:2013-11-01 21:05:09

标签: matlab sparse-matrix

我的代码适用于这种结构

K>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; mlf

mlf =

                  (1,1)                       1

但它在下面的这种输入中失败了,我在mlf中选择大于零的术语(我无法理解这个选择如何使输入不同)

K>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; mlf(mlf>0)

ans =

   (1,1)        1

唯一的视觉差异是一些标签/空格。

请解释它们的不同之处。

2 个答案:

答案 0 :(得分:2)

我认为答案是结果数组的大小,正如Rody建议的那样:

>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; size(mlf(mlf>0))
ans =
     1     1
>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; size(mlf)
ans =
                2147483649                         1

* 编辑1 :索引正常工作:

>> mlf(mlf>0) = 2
mlf =
                  (1,1)                       2

这在功能上等同于使用find

>> mlf(find(mlf)) = 2
mlf =
                  (1,1)                       2

似乎是一个很好的结论,display正在为(2147483649,1)处的元素设置足够的空间格式化输出,但仅当您为该元素的赋值建立索引时(想想左倾与左右)。

* EDIT 2 :如果您要在完整(非稀疏)变量中使用这些元素,请使用full

>> full(mlf(mlf>0))
ans =
     1

* 编辑3 :根据mlf的尺寸而不是最后一个非零元素分配给最后一个元素,

>> mlf(numel(mlf))=77
mlf =
                  (1,1)                       1
         (2147483649,1)                      77

* 编辑4 :删除负值:

mlf(mlf<0)=0; % or mlf(find(mlf<0)) = 0;

如果您想复制并删除底片:

mlf2 = mlf;
mlf2(mlf2<0) = 0;
mlf3 = mlf;
mlf3(mlf3>0) = 0;

然后,您mlf包含所有值,mlf2只有正数,mlf3只有负数。 关键是大小与原始mlf保持一致,因此您可以根据稀疏的大小以原始方式使用end之类的内容,欢呼!

答案 1 :(得分:0)

Rody Oldenhuis推荐whos

>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; mlf=mlf(mlf>0)

mlf =

   (1,1)        1


>> whos mlf
  Name      Size            Bytes  Class     Attributes

  mlf       1x1                32  double    sparse    

>> mlf=sparse([],[],[],2^31+1,1); mlf(1)=1; mlf

mlf =

                  (1,1)                       1

>> whos mlf
  Name               Size            Bytes  Class     Attributes

  mlf       2147483649x1                32  double    sparse    

显示了关键问题:结构的大小已经改变。 chappjc提供了一种通过引入新变量来解决这个问题的方法。