Ok issue settled! Thanks guys, that really helped.
Actually what Jacob suggested may have already worked i.e., evaluating the
code inside the function.

The reason I was still (i.e., despite function usage) getting long
processing time was because instead of erasing my earlier code I decide to
block comment it. I found on Google that some one suggested a way to block
comment was to use ###  ###.
I was misled by it. The old code still hung around and was getting
evaluated. I had to comment each line.

I haven't still figured out a way to block comment on Julia. Maybe it does
not exist?

Anyway, now I actually implemented sum(sub(A...)) as Stefan suggested and
implemented a function call and timed it using @time.

It is coming out 13.8 seconds. I should time Matlab, but I am quite excited
already! I know it comes very close. Finally a match to Matlab. Hopefully I
will remain a happy camper at Julia (still struggling with Xubuntu
installation though). How delighted I am. Thanks folks(developers) for your
great work.

A general question: I find the main Julia document very sparse in
description. For example I just couldn't figure out how to use @time.
The standard library just gives one line definition.  I generally end up
searching in the forum and most of the time I am lucky.
The forum is gracious but I do not want to often post stupid questions.



On Wed, Jan 29, 2014 at 6:27 PM, Rajan Gurjar <rjngrj2...@gmail.com> wrote:

> Stefan,
> sum(foo) did not work for me. It gave error and then I realized why.
> sum(Array) turns out to be an array of (Float64,1) while the left hand
> side is an element of an array. Therefore, I had to do another sum on that
> one element array to give me a scalar. I just could not figure out the
> error for almost an hour and then when I did
> (sum(foo))
> it would give me a number but
> S(i,j)=sum(foo) did not and gave error (I do not recall the error but I
> think it was something like "conversion for this type not possible"!)
> Of course being fresh to Julia I did not figure this out and then I
> realized that this occurs usually in scipy too.
> But you are correct, I will change the sum(sum) provided I am able to
> figure out how to convert the array to a number.
>
> Also I tried plain summation without using sum just like your last section
> but it is was twice slower. I have that code too and
> I will recheck again to see how it differs from your last section.
>
> John, I will implement some of Stefan's suggestion and run the timing that
> you suggested. But what I am doing is very simple. I copy paste each
> section of the code (both Matlab and Julia) and run them and time them. I
> find that only that last piece which I wrote takes full 40 odd seconds. But
> I should find out which line takes up that time.
>
> Thanks
>
>
>
>
> On Wed, Jan 29, 2014 at 12:59 PM, Stefan Karpinski 
> <ste...@karpinski.org>wrote:
>
>> This sum(sum(foo,2)) business is really wasteful. Just do sum(foo) to
>> take the sum of foo. It's also better to extract the dimensions into
>> individual variables. Something like this:
>>
>> function runave1(S,A,f)
>>   s1, s2 = size(A)
>>   p1 = f+1
>>   for n = f+1:s2-f-1, m = f+1:s1-f
>>     S[m,n+1] = S[m,n] + sum(A[m-f:m+f,n+p1]) - sum(A[m-f:m+f,n-f])
>>   end
>>   S
>> end
>>
>>
>> I suspect that since Matlab forces this sum(sum(X,2)) idiom on you, it
>> probably detects it and automatically does the efficient thing. It's
>> unclear to me why you need two sum operations when the slices you're taking
>> are just single columns, but maybe I'm missing something here.
>>
>> Currently, taking array slices in Julia makes a copy, which is
>> unfortunate, but in the future they will be views. In the meantime, you
>> might get better performance by explicitly using views:
>>
>> function runave2(S,A,f)
>>   s1, s2 = size(A)
>>   p1 = f+1
>>   for n = f+1:s2-f-1, m = f+1:s1-f
>>     S[m,n+1] = S[m,n] + sum(sub(A,m-f:m+f,n+p1)) - sum(sub(A,m-f:m+f,n-f))
>>   end
>>   S
>> end
>>
>>
>> And, of course, there's always the nuclear option for really performance
>> critical code, which is to write out the summation manually:
>>
>> function runave3(S,A,f)
>>   s1, s2 = size(A)
>>   p1 = f+1
>>   for n = f+1:s2-f-1, m = f+1:s1-f
>>     t = S[m,n]
>>     for k = m-f:m+f; t += A[k,n+p1] - A[k,n-f]; end
>>     S[m,n+1] = t
>>   end
>>   S
>> end
>>
>>
>> Not so elegant, but probably the fastest possible version. Ideally, once
>> array slices are views, the simpler version of the code will be essentially
>> equivalent to this. It will take some compiler cleverness, but it's
>> certainly doable. It would be interesting to hear how each of these
>> versions performs on your data.
>>
>> On Wed, Jan 29, 2014 at 12:30 PM, John Myles White <
>> johnmyleswh...@gmail.com> wrote:
>>
>>> Can you show the call to @time / @elapsed so we know exactly what's
>>> being timed?
>>>
>>>  -- John
>>>
>>> On Jan 29, 2014, at 9:28 AM, Rajn <rjngrj2...@gmail.com> wrote:
>>>
>>> > Now it takes even longer i.e., ~1 minute
>>> >
>>> > Does this make sense. Also I am running this loop only once. I do not
>>> understand why writing in the function form would help. I read the manual
>>> but they suggest writing function form for something which is used many
>>> times.
>>> > I=runave(S,A,f)
>>> > showim(I);
>>> >
>>> > function runave(S,A,f)
>>> >   imsz=size(A);
>>> >   p1=f+1;
>>> >   for n=(f+1):(imsz[2]-f-1)
>>> >     for m=(f+1):(imsz[1]-f)
>>> >
>>> S[m,n+1]=S[m,n]+sum(sum(A[m-f:m+f,n+p1],2))-sum(sum(A[m-f:m+f,n-f],2));
>>> >     end
>>> >   end
>>> >   S;
>>> > end
>>> >
>>> > Do I have to declare function parameters to speed it up.
>>>
>>>
>>
>

Reply via email to