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
我認爲可以在這裏提供的幫助數量是有限的,因爲你的代碼沒有意義。對於初學者,你斷言'## A,B,C是矩陣,但是你的函數簽名聲明瞭A :: Int64,B :: Int64,c :: Int64'。儘管如此,在'for'循環中確實將'A','B'和'c'作爲矩陣處理......此外,函數修改了輸入'c',所以通常會將簽名' dacmm!',只是爲了讓其他人意識到輸入已被修改。 –
是的,對於來自其他科學編程語言(如R或Matlab)的新手來說,這是一個經典問題,他們沒有標量的概念。 「Int64」明確表示一個標量。 Ints矩陣被稱爲「矩陣{Int64}」。但實際上沒有理由指定所有輸入參數的類型,除非您想定義多個方法來改變輸入參數類型的行爲。 –
我認爲'n/2'給出了一個浮點數,但是你爲它指定了Int。 – daycaster