Какой метод я неправильно использую?

#arrays #matrix #methods #julia #histogram

Вопрос:

Я новичок в Джулии и в настоящее время пытаюсь запустить следующий код:

 Using DelimitedFiles  M=readdlm(data)  ts,A=M[:,1],M[:,2:end]  (nsweeps,N)=size(A)  dx=0.01;  x=[minimum(collect(A)):dx:maximum(collect(A))];  bx=[x-dx/2,x[end] dx/2];  

Но, когда я пытаюсь запустить последнюю строку кода, это выдает мне следующую ошибку:

 MethodError: no method  matching(::Array{StepRangeLen{Float64,Base.TwicePrecision {Float64},Base.TwicePrecision{Float64}},1}, ::Float64)  Closest candidates are: -(!Matched::BigFloat, ::Union{Float16, Float32, Float64}) at  mpfr.jl:437 -(!Matched::Complex{Bool}, ::Real) at complex.jl:307 -(!Matched::Missing, ::Number) at missing.jl:115  

Не могли бы вы, пожалуйста, помочь мне? Кроме того, данные, которые я использую, это

 30×6 Array{Float64,2}  

ОБНОВЛЕНИЕ вот вся функция, которую я пытаюсь запустить, заключается в следующем:

 function mymain(filename,nsamples) start_time=time()  M=readdlm(filename) ts,A=M[:,1],M[:,2:end] (nsweeps,N)=size(A)  dx=0.01; x=[minimum(collect(A)):dx:maximum(collect(A))]; bx=[x-dx/2,x[end] dx/2]; (bx,hA)=hist(A[:],bx);  f1=figure() subplot(2,1,1); plot(ts,A,"-o"); xlabel("Time [ms]"); ylabel("Amps  [mV]");  subplot(2,1,2); plot(x,hA,"-"); xlabel("Amps [mV]");  ylabel("Density");draw()  nparams=8   Sx=Array(ASCIIString,1,nparams)  Rx=zeros(2,nparams)  nx=zeros(Int,1,nparams)   Sx[1,1]="p"; Rx[1:2,1]=[0.02,0.98]; nx[1]=49 Sx[1,2]="n"; Rx[1:2,2]=[1,20]; nx[2]=20  Sx[1,3]="tD"; Rx[1:2,3]=[50,200]; nx[3]=46 Sx[1,4]="a"; Rx[1:2,4]=[0.05,0.5]; nx[4]=46 Sx[1,5]="siga"; Rx[1:2,5]=[0.01,0.2]; nx[5]=39 Sx[1,6]="sigb"; Rx[1:2,6]=[0.01,0.1]; nx[6]=19 Sx[1,7]="tauf"; Rx[1:2,7]=[50,200]; nx[7]=46 Sx[1,8]="u1"; Rx[1:2,8]=Rx[1:2,1]; nx[8]=nx[1]   x=zeros(maximum(nx),nparams) p=zeros(maximum(nx),nparams) dx=zeros(1,nparams)  for j=1:nparams x[1:nx[j],j]=linspace(Rx[1,j],Rx[2,j],nx[j])' dx[j]=x[2,j]-x[1,j] end  S=zeros(Int,nsamples,nparams)   sold=zeros(Int,1,nparams) for j=1:nparams sold[j]=rand(1:nx[j]) end  while x[sold[4],4]lt;=x[sold[5],5]  sold[4]=rand(1:nx[4]) sold[5]=rand(1:nx[5]) end  while x[sold[8],8]lt;=x[sold[1],1]  sold[1]=rand(1:nx[1]) sold[8]=rand(1:nx[8]) end  xold=zeros(1,nparams) xnew=zeros(1,nparams) for j=1:nparams xold[j]=x[sold[j],j] end llold=myloglikelihood(xold,ts,A)   for k=1:nsamples  snew=sold rand(-1:1,1,nparams)   if all(ones(1,nparams).lt;=snew.lt;=nx)   allowed2=x[snew[4],4]gt;x[snew[5],5]  allowed3=x[snew[8],8]gt;x[snew[1],1]   if allowed2amp;allowed3  for j=1:nparams xnew[j]=x[snew[j],j] end  llnew=myloglikelihood(xnew,ts,A)   if rand()lt;exp(llnew-llold)  sold,llold=snew,llnew end  end end  S[k,:]=sold  end for k=1:nsamples for j=1:nparams p[S[k,j],j] =1/(nsamples*dx[j]) end end   f2=figure() for j=1:nparams subplot(2,4,j) plot(x[1:nx[j],j],p[1:nx[j],j]); xlabel(Sx[j]) end  diff_time=time()-start_time; println("Total runtime  ",round(diff_time,3),"s=",round(diff_time/60,1),"mins." );  return S  end   

Это согласуется с некоторыми другими функциями, но, как вы можете видеть, это основная функция, поэтому я действительно не могу двигаться вперед, не запустив сначала эту.

Ответ №1:

Неясно, на какой результат вы здесь надеетесь. Поэтому я просто дам несколько советов, которые, надеюсь, помогут.

Во-первых, в этой строке:

 x=[minimum(collect(A)):dx:maximum(collect(A))];  

вызовы к collect являются избыточными. Кроме того, я подозреваю , что вы пытаетесь построить а StepRangeLen , но, вставляя его, [] вы на самом деле получаете а Vector{StepRangeLen} . Я думаю, что то, что вы хотите в этой строке, на самом деле таково:

 x=minimum(A):dx:maximum(A);  

Во-вторых, в этой строке:

 bx=[x-dx/2,x[end] dx/2];  

обратите внимание, что это dx/2 Float64 время x -это StepRangeLen . Это важно, потому что последняя представляет собой коллекцию, поэтому, если вы хотите выполнить эту операцию по элементам в коллекции, вам необходимо транслировать, то есть x .- dx/2 . Обратите внимание, я подозреваю, что вы, возможно, не используете последнюю версию Julia, потому что, когда я запускаю это, сообщение об ошибке на самом деле прямо говорит мне, что мне нужно транслировать. В любом случае, напротив, x[end] dx/2 все в порядке и не нуждается в трансляции, потому x[end] что есть Float64 . Поэтому я думаю, что ты хочешь:

 bx=[x .- dx/2, x[end]   dx/2];  

Сказав это, мне непонятно , почему вы этого хотите bx , и именно поэтому я сказал в самом начале, что не уверен, на какой результат вы надеялись.

Комментарии:

1. О, большое вам спасибо. Видите ли, я пытаюсь отобразить эти результаты в виде гистограммы, так как я не понимал код ошибки, я начал запускать функцию по разделам, вся функция выглядит следующим образом: