在Julia中乘两个矩阵

在Julia中乘两个矩阵,julia,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

我有这个代码,我想运行它,但我得到了一些错误,我认为这是关于我的数据类型,但我不明白我应该如何编写它来防止它

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

正如堆栈跟踪所指出的,您试图调用
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
返回了一个浮点而不是整数,所以您最终到达了那里


在中没有出现问题,因为在那里,函数的参数没有受到类型信息的太多限制。

我认为这里可以提供的帮助是有限的,因为您的代码没有真正意义。首先,您断言
#A、B、C是矩阵
,但您的函数签名状态是
A::Int64、B::Int64、C::Int64
。尽管如此,您确实将
A
B
c
视为
for
循环中的矩阵。。。此外,该函数修改输入
c
,因此通常编写签名
dacmmInt64
明确表示标量。整数的矩阵称为
矩阵{Int64}
。但事实上,没有理由指定所有输入参数的类型,除非你想定义多个方法,通过输入参数的类型改变行为。我认为
n/2
给出了一个浮点数,但是你为它指定了Int。daycaster是怎么说的。默认情况下,除法运算返回float,即使在整数参数上也是如此,因此它不能用作索引。您可以使用
div
(也可以使用
÷
)进行整数除法。将函数参数保留为非类型化不会带来速度损失。如果要分派不同的方法,则只需要这些类型。