1
私はこのコードを持っていますが、実行したいのですがエラーがあります。それはデータの種類に関するものだと思いますが、それを防ぐためにはどうすればいいですか?Juliaで2つの行列を掛ける
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の行列は 'Matrix {Int64}'と呼ばれます。しかし、実際には、入力引数の型によって動作を変更する複数のメソッドを定義しない限り、すべての入力引数の型を指定する理由はありません。 –
私は 'n/2'は浮動小数点を与えますが、Intを指定すると思います。 – daycaster