Nonzero Min[]
- To: mathgroup at smc.vnet.net
- Subject: [mg43447] Nonzero Min[]
- From: Petr Kujan <kujanp at fel.cvut.cz>
- Date: Wed, 17 Sep 2003 07:59:05 -0400 (EDT)
- Organization: Czech Technical University
- Sender: owner-wri-mathgroup at wolfram.com
Hello MathGroup, I need function which finds nonzero minimum in the list. My definitions are now slower in comparison with kernel function Min[ ]. findmin1[data_] := Min[data] findmin1[dat] // Timing (* 0.01 Second*) (* Very good time consumption but wrong result for me. *) It's possible shorter time consumption for this problem? (*************************************************************) My definition are now: (* Testing data are Integer or Real numbers (possible mixed). *) SeedRandom[1]; dat = Abs[Join[Array[Random[ Integer, {-10, 10}]&, {10^4}], Array[Random[Real, {-10, 10}]&, {10^4}]]]; (*** 2. - Select ***) findmin2[data_] := Min[Select[data, Not[ZeroQ[#]]&]]; findmin3[dat] // Timing (* 0.12 Second *) (*** 3. - Sort ***) dropfirstzeros[dat_List] := Block[{i}, i = 1; While[ZeroQ[dat[[i]]], i = i + 1;]; Drop[dat, i - 1]]; findmin2[data_] := dropfirstzeros[Sort[data]][[1]]; findmin2[dat] // Timing (* 0.14 Second *) (*** 4. - Map ***) getnznum[list_] := Block[{i = 1}, While[ZeroQ[list[[i]]], i++]; list[[i]] ]; findmin4[data_] := Block[{minim = getnznum[data]}, If[(# > 0) && (minim > #), minim = #] & /@ data; minim ]; findmin4[dat] // Timing (* 0.26 Second *) (*** 5. - Do ***) getnznum[list_] := Block[{i = 1}, While[ZeroQ[list[[i]]], i++]; list[[i]] ]; findmin5[data_] := Block[{minim, p}, minim = getnznum[data]; Do[ p = data[[i]]; If[((p > 0) && (minim > p)), minim = p], {i, 1, Length[data]} ]; minim ] findmin5[dat] // Timing (* 0.32 Second *) (*************************************************************) Thank in advance for all your help. Best regards, Petr.