0

我的代码适用于这种结构

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

唯一的视觉区别是一些制表符/空格。

请解释它们有何不同。

4

2 回答 2

2

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

>> 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)但仅当您为该元素的分配建立索引时(想想左值与右值)。

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

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

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

于 2013-11-01T21:55:15.533 回答
0

罗迪奥尔登惠斯推荐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 提供了一种通过引入新变量来解决这个问题的方法。

于 2013-11-01T21:23:08.900 回答