我的代码适用于这种结构
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
唯一的视觉差异是一些标签/空格。
请解释它们的不同之处。
答案 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提供了一种通过引入新变量来解决这个问题的方法。