2017-08-14 108 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中没有发生,因为那里,函数的参数没有被类型信息限制太多。