2017-08-14 109 views
1

我有這段代碼,我想運行它,但出現了一些錯誤,我想這是關於我的數據類型,但我不明白我應該如何編寫它來防止它。在Julia中乘以兩個矩陣

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矩陣被稱爲「矩陣{Int64}」。但實際上沒有理由指定所有輸入參數的類型,除非您想定義多個方法來改變輸入參數類型的行爲。 –

+3

我認爲'n/2'給出了一個浮點數,但是你爲它指定了Int。 – daycaster

回答

1

作爲堆棧跟蹤所指出的,你試圖調用dacmm函數,它接受一個Float64在倒數第二參數的方法,包括:

| 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中沒有發生,因爲那裏,函數的參數沒有被類型信息限制太多。