One could also remove all types and only rely on duck typing. Then one will 
want to initialize r with something like zero(zero(x[1])+zero(y[1])). And 
the same in the if statement. This function would run at the same. I still 
like to specify types as this allows me to restrict input parameters.


Am Freitag, 25. April 2014 08:57:33 UTC+2 schrieb Tomas Lycken:
>
> Yes; if the vectors aren't of the same type, this method isn't applicable. 
> (In other words, you need to have two type arguments in order to support 
> one vector of ints and one vector of floating points). In this case, 
> though, it's probably reasonable to expect only floating point arguments 
> (of the same size), at least as long as they're real.
>
> And as soon as you start working with complex analysis, I'm not entirely 
> sure the trapezoidal rule is valid at all. It might just be because the 
> article author was lazy, but the Wikipedia article only talks about 
> integrals of real-valued functions of one (real, scalar) variable. If you 
> need complex numbers for something more than curiosity about Julia's type 
> system, you probably want another approach altogether...
>
> // Tomas
>
> On Friday, April 25, 2014 7:45:16 AM UTC+2, Hans W Borchers wrote:
>>
>> Understood about the "if"; I often used this extra statement because of 
>> differences between Matlab and R.
>> The function as is returns a floating point number also for integer input 
>> 'x', 'y'.
>> But I am more worried about the case that one of the vectors is real, the 
>> other complex.
>> Do I need two types T1 and T2 for defining different types for the input 
>> vectors?
>>
>>
>> On Thursday, April 24, 2014 10:36:29 PM UTC+2, Cameron McBride wrote:
>>>
>>>
>>> On Thu, Apr 24, 2014 at 4:28 AM, Hans W Borchers <hwbor...@gmail.com>wrote:
>>>>
>>>>     function trapz2{T<:Number}(x::Vector{T}, y::Vector{T})
>>>>         local n = length(x)
>>>>         if (length(y) != n)
>>>>             error("Vectors 'x', 'y' must be of same length")
>>>>         end
>>>>         if n == 1; return 0.0; end
>>>>         r = 0.0
>>>>         for i in 2:n
>>>>             r += (x[i] - x[i-1]) * (y[i] + y[i-1])
>>>>
>>>>         end
>>>>         r / 2.0
>>>>     end
>>>>
>>>>
>>> I'm not sure it's behavior we should "rely on", but the if branch for n 
>>> == 1 isn't necessary in this for loop, although perhaps it was included to 
>>> aid the comparison. A range of 2:1 is a zero-length iteration, so the loop 
>>> will not run even once.  Try this: 
>>>
>>> julia> [2:1]
>>> 0-element Array{Int64,1}
>>>
>>> If  we are being pedantic on types, then the result of the integral 
>>> should at least be a floating point.  Granted, I am not sure of what the 
>>> use case for integer vector inputs would be, but I doubt *if* someone used 
>>> them that they'd want an integer result in return.  (This would be similar 
>>> to sqrt(), for example.)
>>>
>>> Cameron
>>>
>>

Reply via email to