Thank you very much Tom.
I tried the way you say, but I still get an error:
*ERROR: `convert` has no method matching convert(::Type{Float64},
::Array{Float64,2})*
* in TUnit at no file*
* in anonymous at no file:11*
Is it correct the way I define pt_l in TUnit?
immutable TUnit
Node::Int16
a::Float64
b::Float64
c::Float64
inf::Float64
sup::Float64
ton::Int16
toff::Int16
storia0::Int16
pt0::Float64
rampa_up::Float64
rampa_dwn::Float64
rampa_up_str::Float64
rampa_dwn_str::Float64
SUC_C::Float64
tau_max::Int16
#pt_l::Array{Float64,7}
pt_l::Matrix{Float64}
#pt_l::Array{Float64,2}
storia0UP::Float64
storia0DW::Float64
u0::Float64
ton0::Float64
toff0::Float64
#function foo(args)
# #function body
#end
end
2015-06-10 16:36 GMT+02:00 Tom Breloff <[email protected]>:
> I can't be completely sure of your goal and why you can't use a loop, but
> if you need to create those matrices/vectors, this is much cleaner:
>
> gmax = size(generators, 1)
> hmax = size(nodeload, 1)
> inf, sup, ton, toff, storia0 = [generators[:,i] for i in 5:9]
>
> # pt_l here will be a Matrix{Float64} (which is equivalent to
> Array{Float64,2})
> pt_l = inf .+ (sup - inf) * (0:num_PC-1)' / (num_PC-1) # note: the ".+"
> operator broadcasts the column
> # vector inf to
> the (gmax x num_PC) matrix
>
> # the following will be Vector{Float64} (which is equivalent to
> Array{Float64,1})
> storia0UP = max(storia0, 0.0) # there's a version of max/min which
> operate on vectors... no need to use comprehensions
> storia0DW = min(storia0, 0.0)
> u0 = float(map(x -> x>0, storia0)) # mapping an anonymous function to
> the vector, then converting a Vector{Bool} to Vector{Float64} which are 1's
> and 0's
>
> bound0 = x -> max(0.0, min(x, hmax)) # attaching an anonymous function
> to a variable
> ton0 = map(bound0, (ton - storia0UP) .* u0) # mapping that function
> toff0 = map(bound0, (toff - storia0DW) .* (1.0 - u0))
>
> # note you can splat the row from generators first then fill in the
> remaining args
> # no need to do the "cat" step (plus you should use hcat instead of cat(2,
> ...))
> tunits = [TUnit(generators[j,:]..., vec(pt_l[j,:]), storia0UP[j],
> storia0DW[j], u0[j], ton0[j], toff0[j]) for j in 1:gmax]
>
>
> However I still thing you should do:
>
> tunits = TUnit[]
> for j in 1:gmax
> pt_l = ???
> storia0UP = ???
> storia0DW = ???
> u0 = ???
> ton0 = ???
> toff0 = ???
>
> push!(tunits, TUnit(generators[j,:]..., pt_l, storia0UP, storia0DW, u0,
> ton0, toff0))
> end
>
> Let me know if you have any questions.
>
>
>
>
> On Wednesday, June 10, 2015 at 8:16:10 AM UTC-4, Michela Di Lullo wrote:
>>
>> I still get an error......
>>
>> Let's try again..
>>
>> num_PC=7
>>
>> immutable TUnit
>> Node::Int16
>> a::Float64
>> b::Float64
>> c::Float64
>> inf::Float64
>> sup::Float64
>> ton::Int16
>> toff::Int16
>> storia0::Int16
>> pt0::Float64
>> rampa_up::Float64
>> rampa_dwn::Float64
>> rampa_up_str::Float64
>> rampa_dwn_str::Float64
>> SUC_C::Float64
>> tau_max::Int16
>> pt_l::Float64
>> storia0UP::Float64
>> storia0DW::Float64
>> u0::Float64
>> ton0::Float64
>> toff0::Float64
>> end
>>
>> generators = readdlm("$MyDataPath/gen" * "$NumBuses" * "_" *
>> "$GenInstance" * ".dat") *#matrix of dimension 6*16*
>> nodeload = readdlm("$MyDataPath/nodeload" * "$NumBuses" * "_" *
>> "$NodeloadInstance" * ".dat")
>>
>> gmax=int(size(generators,1))
>> hmax=int(size(nodeload,2))
>> inf=generators[1:size(generators,1),5]
>> sup=generators[1:size(generators,1),6]
>> storia0=generators[1:size(generators,1),9]
>> ton=generators[1:size(generators,1),7]
>> toff=generators[1:size(generators,1),8]
>>
>> #here below I'm computing some other quantities, I want to add as
>> attributes of the object TUnit,
>> #together with the ones in generators:
>>
>> *pt_l=([inf[j]+(r-1)*(sup[j]-inf[j])/(num_PC-1) for j=1:gmax,
>> r=1:num_PC]) #matrix of dimensions (gmax=6)*(num_PC=7)*
>> * storia0UP = [max(storia0[j],0) for j=1:gmax] #vector of dimensions
>> (gmax=6)*1*
>> * storia0DW = -[min(storia0[j],0) for j=1:gmax] **#vector of
>> dimensions (gmax=6)*1*
>> * u0=[(storia0[j] > 0 ? 1 : 0) for j=1:gmax] **#vector of dimensions
>> (gmax=6)*1*
>> * ton0 = int16([min(hmax, max(0,(ton[j]-storia0UP[j])*u0[j])) for
>> j=1:gmax]) **#vector of dimensions (gmax=6)*1*
>> * toff0= int16([min(hmax, max(0,(toff[j]-storia0DW[j])*(1-u0[j]))) for
>> j=1:gmax]) **#vector of dimensions (gmax=6)*1*
>>
>> generators = cat(2, generators, pt_l, storia0UP, storia0DW, u0, ton0,
>> toff0) #matrix of dimensions (gmax=6)*28
>>
>> TUnitS = Array(TUnit,size(generators,1))
>>
>> for j in 1:size(generators,1)
>> TUnitS[j] = TUnit(generators[j,1:end]...)
>> end
>>
>> and I get:
>>
>> *ERROR: `TUnit` has no method matching TUnit(::Float64, ::Float64,
>> ::Float64, ::Float64, ::Float64, ::Float64, ::Float64, ::Float64,
>> ::Float64, ::Float64, ::Float64, ::Float64, ::Float64, ::Float64,
>> ::Float64, ::Float64, ::Float64, ::Float64, ::Float64, ::Float64,
>> ::Float64, ::Float64, ::Float64, ::Float64, ::Float64, ::Int64, ::Int16,
>> ::Int16)*
>>
>> * in anonymous at no file:5*
>>
>> How could I specify that pt_l, attribute of the object TUnit, is a Matrix
>> and not a vector?
>>
>> Thanks in advance for any suggestion,
>>
>> Michela
>>
>>
>>
>>
>>
>> Il giorno martedì 9 giugno 2015 18:54:56 UTC+2, Tom Breloff ha scritto:
>>>
>>> Seems like this would be much easier in a loop, rather than creating
>>> lots of temporaries only to extract them out later.
>>> tunits = TUnit[]
>>> for i in size(generators,1)
>>> pt_I = # create vector
>>> storia0UP = # create Float64
>>> # set other vars
>>> push!(tunits, TUnit(generators[j,:]..., pt_I, storia0UP, <other vars>))
>>> end
>>>
>>>
>>> On Tuesday, June 9, 2015 at 11:37:37 AM UTC-4, Michela Di Lullo wrote:
>>>>
>>>>
>>>>
>>>> num_PC=7
>>>> generators = readdlm("$MyDataPath/gen" * "$NumBuses" * "_" *
>>>> "$GenInstance" * ".dat")
>>>>
>>>> inf=generators[1:size(generators,1),5]
>>>> sup=generators[1:size(generators,1),6]
>>>> pt_l=([inf[j]+(r-1)*(sup[j]-inf[j])/(num_PC-1) for j=1:gmax,
>>>> r=1:num_PC])
>>>> storia0=generators[1:size(generators,1),9]
>>>> ton=generators[1:size(generators,1),7]
>>>> toff=generators[1:size(generators,1),8]
>>>> storia0UP = [max(storia0[j],0) for j=1:gmax]
>>>> storia0DW = -[min(storia0[j],0) for j=1:gmax]
>>>> u0=[(storia0[j] > 0 ? 1 : 0) for j=1:gmax]
>>>> ton0 = int16([min(hmax, max(0,(ton[j]-storia0UP[j])*u0[j])) for
>>>> j=1:gmax])
>>>> toff0= int16([min(hmax, max(0,(toff[j]-storia0DW[j])*(1-u0[j])))
>>>> for j=1:gmax])
>>>>
>>>> generators = cat(2, generators, pt_l, storia0UP, storia0DW, u0,
>>>> ton0, toff0)
>>>>
>>>> immutable TUnit
>>>> Node::Int16
>>>> a::Float64
>>>> b::Float64
>>>> c::Float64
>>>> inf::Float64
>>>> sup::Float64
>>>> ton::Int16
>>>> toff::Int16
>>>> storia0::Int16
>>>> pt0::Float64
>>>> rampa_up::Float64
>>>> rampa_dwn::Float64
>>>> rampa_up_str::Float64
>>>> rampa_dwn_str::Float64
>>>> SUC_C::Float64
>>>> tau_max::Int16
>>>> pt_l
>>>> storia0UP::Float64
>>>> storia0DW::Float64
>>>> u0::Float64
>>>> ton0::Float64
>>>> toff0::Float64
>>>> end
>>>>
>>>> TUnitS = Array(TUnit,size(generators,1))
>>>>
>>>> for j in 1:size(generators,1)
>>>> TUnitS[j] = TUnit(generators[j,1:end]...)
>>>> end
>>>>
>>>>
>>>>
>>>