问题是我的函数还是我尝试使用的数据集?

问题描述 投票:0回答:1

我是 Julia 编程新手,因此在研究论文时我发现了以下代码,但我似乎无法理解错误是什么。函数 main 应该获取一个数据集,然后绘制一些结果,但是当我尝试调用该函数时:

info = readdlm("DataSet.txt")

顺便说一下,DataSet 是一个:

30×6 Array{Float64,2}

然后,当我调用该函数时:

mymain(info,5)

它返回以下内容:

MethodError: no method matching readdlm_auto(::Array{Float64,2}, ::Char, ::Type{Float64}, ::Char, ::Bool)
Closest candidates are:
readdlm_auto(!Matched::Array{UInt8,1}, ::AbstractChar, ::Type, ::AbstractChar, ::Bool;  ...) 

我尝试修改我的数据,但我不明白错误在哪里。整个功能如下:

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]<=x[sold[5],5]    
sold[4]=rand(1:nx[4])
sold[5]=rand(1:nx[5])
end

while x[sold[8],8]<=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).<=snew.<=nx)            

allowed2=x[snew[4],4]>x[snew[5],5]        
allowed3=x[snew[8],8]>x[snew[1],1]         

if allowed2&allowed3

for j=1:nparams
xnew[j]=x[snew[j],j]
end

llnew=myloglikelihood(xnew,ts,A)     

if rand()<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    
function methods graph julia
1个回答
2
投票

这个问题已在 Julia Discourse here 上得到解答 - 在交叉发帖到不同论坛时请说清楚。

简而言之,答案是

info = readdlm("DataSet.txt")

将数据本身(而不是文件名)绑定到变量

info
,所以然后做

mymain(info, 5)

不起作用,因为

mymain
需要文件名而不是实际数据集作为输入。

© www.soinside.com 2019 - 2024. All rights reserved.