在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
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
返回一个浮点数不是一个整数。
这个问题在original code中没有发生,因为那里,函数的参数没有被类型信息限制太多。
我认为可以在这里提供的帮助数量是有限的,因为你的代码没有意义。对于初学者,你断言'## A,B,C是矩阵,但是你的函数签名声明了A :: Int64,B :: Int64,c :: Int64'。尽管如此,在'for'循环中确实将'A','B'和'c'作为矩阵处理......此外,函数修改了输入'c',所以通常会将签名' dacmm!',只是为了让其他人意识到输入已被修改。 –
是的,对于来自其他科学编程语言(如R或Matlab)的新手来说,这是一个经典问题,他们没有标量的概念。 “Int64”明确表示一个标量。 Ints矩阵被称为“矩阵{Int64}”。但实际上没有理由指定所有输入参数的类型,除非您想定义多个方法来改变输入参数类型的行为。 –
我认为'n/2'给出了一个浮点数,但是你为它指定了Int。 – daycaster