[julia-users] Re: Merge functions from different headers (Matrix vs. Vector)

2016-10-14 Thread DNF
On Friday, October 14, 2016 at 3:16:31 PM UTC+2, Martin Florek wrote:
>
> Thank you very much. This is very elegant way, I think that it solve my 
> problem.
>

You're welcome. If you are looking to improve performance further, you 
could add @inbounds and @simd macro calls, as seen 
here: 
http://docs.julialang.org/en/release-0.5/manual/performance-tips/#performance-annotations


[julia-users] Re: Merge functions from different headers (Matrix vs. Vector)

2016-10-14 Thread DNF
As a proposal, this is what I would do, given you requirements:

function _scaleRestore!(Z, Zout, shift, stretch)
for j in 1:size(Z, 2), i in 1:size(Z, 1)
Zout[i, j] = Z[i, j] * stretch[j] + shift[j]
end
return Zout
end
scaleRestore!(Z::Vector, shift::Number, stretch::Number) = _scaleRestore!(Z, 
Z, shift, stretch)
scaleRestore!(Z::Matrix, shift::Vector, stretch::Vector) = _scaleRestore!(Z, 
Z, shift, stretch)

scaleRestore(Z::Vector, shift::Number, stretch::Number) = _scaleRestore!(Z, 
similar(Z), shift, stretch)
scaleRestore(Z::Matrix, shift::Vector, stretch::Vector) = _scaleRestore!(Z, 
similar(Z), shift, stretch)

I put in both mutating and non-mutating versions, just in case. Single 
signature definition I cannot help you with, I'm afraid.


[julia-users] Re: Merge functions from different headers (Matrix vs. Vector)

2016-10-14 Thread DNF
I don't know of any way to accomplish what you want with a single method 
signature. I don't see how Union can help you, because you would not be 
able to disallow (Vector x Vector x Vector) input, for example. You 
normally achieve this in Julia by writing two separate methods, which is 
what you already did. Do you have a very good reason to merge those to 
methods?

With respect to your memory constraints, you should not use transpose 
anyway, because that creates a copy. The following uses minimal memory, 
scales Z in-place, and works for both your input cases (it is allowed to 
index into a scalar), but doesn't solve your type signature problem:

function scaleRestore!(Z, shift, stretch)
for j in 1:size(Z, 2), i in 1:size(Z, 1)
Z[i, j] = Z[i, j] * stretch[j] + shift[j]
end
return Z
end

If you don't want in-place, just create an output array first.


On Friday, October 14, 2016 at 10:35:56 AM UTC+2, Martin Florek wrote:
>
> Thanks DNF,
> but I want to just merge version 1 and 2 with limited to one vector - two 
> scalars OR one matrix - two vectors into a single definition. On the 
> function f_scaleRestore does not matter, can have different forms. I also 
> have requirements for memory, so I use broadcast(). So the question is how 
> to write a function, where I enter only two kinds of desired input? 
>  Probably the solution is Union{}, but how to implement it.
>
> On Friday, 14 October 2016 10:03:15 UTC+2, DNF wrote:
>>
>> Hmm. I slightly misread the way you had set up your code. I thought you 
>> wanted your code to cover three cases: all scalar, one vector - two 
>> scalars, and one matrix - two vectors.
>>
>> So to be clear: defining the function:
>>
>> scaleRestore(a, b, c) = a .* b' .+ c'
>>
>> covers both your cases and then some others. Unless you have some 
>> particular reason to constrain the inputs in some way, I wouldn't add all 
>> the type declarations, but just leave the function generic.
>>
>>
>> On Friday, October 14, 2016 at 9:55:21 AM UTC+2, DNF wrote:
>>>
>>> This should work for the three cases you have set up:
>>>
>>> f_scaleRestore(a, b, c) = a .* b' .+ c'
>>>
>>>
>>> On Friday, October 14, 2016 at 9:12:55 AM UTC+2, Martin Florek wrote:

 Hi all,

 I have the following two functions and I want to sensibly merge them 
 into one. How to marge headers and body of function for Matrix and Vector?
 - 
 f_scaleRestore(a::Float64, b::Float64, c::Float64) = a * b + c;
 -  
 - # version 1
 - function scaleRestore(Z::Matrix{Float64}, shift::Vector{Float64}, 
 stretch::Vector{Float64})
 -   broadcast(f_scaleRestore, Z, stretch', shift')
 - end
 -  
 - # version 2
 - function scaleRestore(Z::Vector{Float64}, shift::Float64, stretch::
 Float64)
 -   broadcast(f_scaleRestore, Z, stretch, shift)
 - end


 Thanks in advance,
 Martin

>>>

[julia-users] Re: Merge functions from different headers (Matrix vs. Vector)

2016-10-14 Thread DNF
Hmm. I slightly misread the way you had set up your code. I thought you 
wanted your code to cover three cases: all scalar, one vector - two 
scalars, and one matrix - two vectors.

So to be clear: defining the function:

scaleRestore(a, b, c) = a .* b' .+ c'

covers both your cases and then some others. Unless you have some 
particular reason to constrain the inputs in some way, I wouldn't add all 
the type declarations, but just leave the function generic.


On Friday, October 14, 2016 at 9:55:21 AM UTC+2, DNF wrote:
>
> This should work for the three cases you have set up:
>
> f_scaleRestore(a, b, c) = a .* b' .+ c'
>
>
> On Friday, October 14, 2016 at 9:12:55 AM UTC+2, Martin Florek wrote:
>>
>> Hi all,
>>
>> I have the following two functions and I want to sensibly merge them 
>> into one. How to marge headers and body of function for Matrix and Vector?
>> - 
>> f_scaleRestore(a::Float64, b::Float64, c::Float64) = a * b + c;
>> -  
>> - # version 1
>> - function scaleRestore(Z::Matrix{Float64}, shift::Vector{Float64}, 
>> stretch::Vector{Float64})
>> -   broadcast(f_scaleRestore, Z, stretch', shift')
>> - end
>> -  
>> - # version 2
>> - function scaleRestore(Z::Vector{Float64}, shift::Float64, stretch::
>> Float64)
>> -   broadcast(f_scaleRestore, Z, stretch, shift)
>> - end
>>
>>
>> Thanks in advance,
>> Martin
>>
>

[julia-users] Re: Merge functions from different headers (Matrix vs. Vector)

2016-10-14 Thread DNF
This should work for the three cases you have set up:

f_scaleRestore(a, b, c) = a .* b' .+ c'


On Friday, October 14, 2016 at 9:12:55 AM UTC+2, Martin Florek wrote:
>
> Hi all,
>
> I have the following two functions and I want to sensibly merge them into 
> one. How to marge headers and body of function for Matrix and Vector?
> - 
> f_scaleRestore(a::Float64, b::Float64, c::Float64) = a * b + c;
> -  
> - # version 1
> - function scaleRestore(Z::Matrix{Float64}, shift::Vector{Float64}, 
> stretch::Vector{Float64})
> -   broadcast(f_scaleRestore, Z, stretch', shift')
> - end
> -  
> - # version 2
> - function scaleRestore(Z::Vector{Float64}, shift::Float64, stretch::
> Float64)
> -   broadcast(f_scaleRestore, Z, stretch, shift)
> - end
>
>
> Thanks in advance,
> Martin
>