Thanks Andrzej,
Here is what I tried:
x =.
xx =.
yy =.
g = Compile[{{x, _Real, 2}}, x*UnitStep[x]];
Timing[x = RandomReal[{-0.2, 3}, {60000, 600}];]
Timing[xx = g[x];]
Timing[yy = Clip[x, {0, \[Infinity]}];]
xx == yy
With outputs:
{1.89,Null}
{2.094,Null}
{0.406,Null}
True
It appears that Clip[] is very efficient.
Kevin
Andrzej Kozlowski wrote:
You can do it somewhat faster by not using patterns and compiling. For
example, if your data set is a list of reals:
f = Compile[{{x, _Real, 1}}, x*UnitStep[x]]
should be faster than the codes below (at least it is so on my
PowerBook). Of course you have to change it to:
g = Compile[{{x, _Real, 2}}, x*UnitStep[x]]
if your data set is a matrix.
Andrzej Kozlowski
On 30 Oct 2007, at 19:46, Steve Luttrell wrote:
> These do the sort of thing you want
>
> {1, 2, -3, -4, 5, 6} /. {_?(# < 0 &) -> 0}
>
> {1, 2, -3, -4, 5, 6} /. {_?NonPositive -> 0}
>
> and both give
>
>
> --
> Steve Luttrell
> West Malvern, UK
>
> "Kevin J. McCann" <Kevin.McCann at umbc.edu> wrote in message
> news:fg6qha$dj0$1 at smc.vnet.net...
>> I have a very large data set (64000 x 583) in which negative values
>> indicate "no data", unfortunately these negatives are not all the same.
>> I would like to efficiently set all these negatives to zero. I know that
>> I will likely be embarrassed when I see how to do it, but I can't seem
>> to remember or figure it out. I should emphasize that because of the
>> size of the data set, this needs to be done efficiently. Another
>> programming language does it as follows:
>>
>> x(x < 0) = 0;
>>
>> Thanks,
>>
>> Kevin
>> --
>>
>> Kevin J. McCann
>> Research Associate Professor
>> JCET/Physics
>> Physics Building
>> University of Maryland, Baltimore County
>> 1000 Hilltop Circle
>> Baltimore, MD 21250
>>
>
>
--
Kevin J. McCann
Research Associate Professor
JCET/Physics
Physics Building
University of Maryland, Baltimore County
1000 Hilltop Circle
Baltimore, MD 21250