2017-11-22 11 views
1

안녕하세요!Hcat 및 vcat이 잘못된 유형을 반환합니다.

저는 프로그래밍에 거의 새롭고 작은 양자 물리 시뮬레이션을 위해 줄리아를 사용합니다. 기본적으로 행렬을 만들고 줄리아를 사용하여 대각선으로 만듭니다. 어제까지 나는 "JuliaPro"를 사용했으나 정상적으로 작동했지만 어떤 것들이 나에게 화가났다. 그래서 그것을 제거하고, Atom Editor와 가장 최근의 Julia 커맨드 라인 버전 (v0.6.1)을 다운로드했다.

경우는 관련이있을 수 : 처음 패키지를 추가했다 "PyPlot를 사용하여"사용하려고하면 및 발생하는 오류는 여기에 설명 : 나는 패키지의 일부 재설치를하고

https://discourse.julialang.org/t/error-installing-pyplot-the-python-package-mpl-toolkits-mplot3d-could-not-be-found-by-pyimport/6372과 같이 아나콘다로 전환 여기에 설명 : https://github.com/JuliaPy/PyPlot.jl/issues/313

지금 실제 문제가 있습니다. hcat() 및 vcat()을 사용하여 더 작은 2 차원 배열에서 더 큰 행렬을 만드는 함수가 있습니다. 이 기능은 다음과 같습니다 (와 console output

기본적으로, 나는 단지 배열을 연결하지만, 어떻게 든 내 결과는 이런 일이하지 않았습니다 스파 스 매트릭스가된다 :

function InfiniteHamil(E, EA, EAB, FA_list, FB_list, d_list, ϵ_list) 
    #------------------------------ 
    num_steps = 200 
    x_values = collect(0:1/num_steps:1) 
    y_values = [] 

    #------------------------------ 
    for x in x_values 
     k = path(x) 
     z1 = exp(im*k[1]) 
     z2 = exp(im*k[1]/2)*exp(im*sqrt(3)*k[2]/2) 
     c1 = cos(k[1]) 
     c2 = cos(k[1]/2 + k[2]*sqrt(3)/2) 
     c12 = cos(k[1]/2 - k[2]*sqrt(3)/2) 

     secondHam = vcat(hcat(E+ 2*(c1*d_list[1] + c2*d_list[2]+ c12*d_list[5]), 
          FA_list[1]+ conj(z2)*(FA_list[2]+z1*FA_list[3]), 
          FB_list[1]+ conj(z2)*(FB_list[2]+z1*FB_list[3])), 
         hcat((FA_list[1]+ conj(z2)*(FA_list[2]+z1*FA_list[3]))', 
          EA+ 2*(c1*ϵ_list[1]+c2*ϵ_list[2]+c12*ϵ_list[5]), 
          EAB), 
         hcat((FB_list[1]+ conj(z2)*(FB_list[2]+z1*FB_list[3]))', 
          EAB', 
          EA+ 2*(c1*ϵ_list[1]+c2*ϵ_list[2]+c12*ϵ_list[5]))) 

     #print types of constituents 
     println(typeof(E+ 2*(c1*d_list[1] + c2*d_list[2]+ c12*d_list[5]))) 
     println(typeof(FA_list[1]+ conj(z2)*(FA_list[2]+z1*FA_list[3]))) 
     println(typeof(FB_list[1]+ conj(z2)*(FB_list[2]+z1*FB_list[3]))) 
     println(typeof((FA_list[1]+ conj(z2)*(FA_list[2]+z1*FA_list[3]))')) 
     println(typeof(EA+ 2*(c1*ϵ_list[1]+c2*ϵ_list[2]+c12*ϵ_list[5]))) 
     println(typeof(EAB)) 
     println(typeof((FB_list[1]+ conj(z2)*(FB_list[2]+z1*FB_list[3]))')) 
     println(typeof(EAB')) 
     println(typeof(EA+ 2*(c1*ϵ_list[1]+c2*ϵ_list[2]+c12*ϵ_list[5]))) 
     println(typeof(secondHam)) 

     push!(y_values , filter(x -> x > -10, sort(real(eigvals(secondHam))))) 

    end 
    #------------------------------ 
    y_values = hcat(y_values...) 
    plotData(x_values,y_values) 
end 

출력, 나는 얻을 정확한 동일한 코드)를 다시 설치하십시오. 누군가 여기서 무슨 일이 일어나는지 말해 줄 수 있니?

답변

1

그래서 .. 나는 그것을 스스로 해결했지만 정확한 문제는 정확히 알지 못합니다. 그러나, 그것은 내 출력에 표시되는 "Diagonal"유형과 관련이 있습니다. Diagonal() 대신 diagm()을 사용하면 오류가 발생하지 않습니다.

+2

'Diagonal ([1,2,3])'은'diagm ([1,2,3])'와는 다른 출력 유형을 가지고 있습니다. 또한 전자는 생성자이고 후자는 함수라는 점에 유의하십시오. 유형, 더 일반적으로 다중 발송은 Julia 언어의 핵심입니다. 코멘트는 실제로 어떤 깊이에서도 들어갈 수있는 장소가 아니므로 절름발이가되어 공식 문서를주의 깊게 읽으라고 제안합니다. 이것은 꽤 많은 시간이 걸릴 것이지만, 덜 만족스럽고 프로그래밍 언어가 다른 몇몇 언어에서 온 것이므로, 그만한 가치가 있다고 약속합니다. –

+0

공식 문서에서 약간 읽으려고했지만, 나는 그들이 모르는 용어에 대한 설명을 자주 놓치기 때문에 거의 교육적이지 않다는 것을 알게되었습니다. Julia에게 추천할만한 보충 정보가 있습니까? – Banana

+1

공식 문서가 놀랍도록 훌륭하다고 생각했지만, 다시 Matlab, Python, R 및 .NET을 포함한 배경에서 왔습니다. 프로그래밍을 처음 접하는 사람이라면 줄리아에서 계속 일할 수있는 최선의 일을하고 무엇인가 확실하지 않으면 언제든지 문서를 확인하고 스택 오버플로를 확인하십시오. 그래도 여전히 훌륭한 리소스를 찾을 수없는 경우 여기 또는 [줄리아 담화 페이지] (https://discourse.julialang.org/)에서 질문하십시오. "첫 단계"태그가 있음에 유의하십시오. 1 년 동안이 일을 끝내면 여기에 질문에 답할 수 있습니다 .-p –