2017-08-14 6 views
1

私はこのコードを持っていますが、実行したいのですがエラーがあります。それはデータの種類に関するものだと思いますが、それを防ぐためにはどうすればいいですか?Juliaで2つの行列を掛ける

function dacmm(i0::Int64, i1::Int64, j0::Int64, j1::Int64, 
     k0::Int64, k1::Int64, A::Int64, B::Int64, c::Int64, n::Int64, basecase::Int64) 
## A, B, C are matrices 
## We compute C = A * B 
    if n > basecase 
     n = n/2 
     dacmm(i0, i1, j0, j1, k0, k1, A, B, c, n, basecase) 
     dacmm(i0, i1, j0, j1+n, k0, k1+n, A, B, c, n, basecase) 
     dacmm(i0+n, i1, j0, j1, k0+n, k1, A, B, c, n, basecase) 
     dacmm(i0+n, i1, j0, j1+n, k0+n, k1+n, A, B, c, n, basecase) 
     dacmm(i0, i1+n, j0+n, j1, k0, k1, A, B, C, n, basecase) 
     dacmm(i0, i1+n, j0+n, j1+n, k0, k1+n, A, B, c, n, basecase) 
     dacmm(i0+n, i1+n, j0+n, j1, k0+n, k1, A, B, c, n, basecase) 
     dacmm(i0+n, i1+n, j0+n, j1+n, k0+n, k1+n, A, B, c, n, basecase) 
    else 
     for i= 1:n, j=1:n, k=1:n 
      c[i+k0,k1+j] = c[i+k0,k1+j] + A[i+i0,i1+k] * B[k+j0,j1+j] 
     end 
    end 
end 

n=4; 
basecase = 2; 
A = [rem(rand(Int32),5) for i =1:n, j = 1:n]; 
B = [rem(rand(Int32),5) for i =1:n, j = 1:n]; 
C = zeros(Int32,n,n); 

エラー: と、ArgumentError:無効なインデックス:1.0

Stacktrace: 
[1] to_indices at ./indices.jl:215 [inlined] 
[2] to_indices at ./indices.jl:213 [inlined] 
[3] getindex at ./abstractarray.jl:882 [inlined] 
[4] dacmm(::Int64, ::Int64, ::Int64, ::Int64, ::Int64, ::Int64, ::Array{Int64,2}, ::Array{Int64,2}, ::Array{Int32,2}, ::Float64, ::Int64) at ./In[24]:16 
[5] dacmm(::Int64, ::Int64, ::Int64, ::Int64, ::Int64, ::Int64, ::Array{Int64,2}, ::Array{Int64,2}, ::Array{Int32,2}, ::Int64, ::Int64) at ./In[24]:6 
[6] include_string(::String, ::String) at ./loading.jl:515 
+0

あなたのコードが本当に意味をなさないので、ここで提供できるヘルプの量は限られていると思います。まず、 '## A、B、Cは行列です 'と主張しますが、関数のシグネチャは' A :: Int64、B :: Int64、c :: Int64'となります。それにもかかわらず、あなたは 'for'ループで' A'、 'B'、' c'を行列として扱っています...また、関数は入力 'c'を変更するので、 dacmm! 'だけで、入力が変更されていることを知っている人もいます。 –

+0

はい、スカラーの概念を持たないRやMatlabなどの他の科学プログラミング言語の新参者にとっては古典的な問題です。 Int64は明示的にスカラを意味します。 Intsの行列は 'Matrix {Int64}'と呼ばれます。しかし、実際には、入力引数の型によって動作を変更する複数のメソッドを定義しない限り、すべての入力引数の型を指定する理由はありません。 –

+3

私は 'n/2'は浮動小数点を与えますが、Intを指定すると思います。 – daycaster

答えて

1

スタックトレースが指摘するように、あなたは最後から二番目の引数でのfloat64を取るdacmm機能のメソッドを呼び出そうとしました:

| V [4] dacmm(::Int64, ::Int64, ... ::Float64, ::Int64) at ./In[24]:16 [5] dacmm(::Int64, ::Int64, ... ::Int64, ::Int64) at ./In[24]:6

ただし、このような方法はありません。 n = n/2は整数ではない浮動小数点数を返したので、そこに終わった。

original codeには、関数の引数が型情報であまり制限されていないため、この問題は発生しません。