Chỉnh sửa/Cập nhật: này bây giờ là một gói phần mềm đăng ký, vì vậy bạn có thể Pkg.add("Einsum")
và bạn sẽ được tốt để đi (xem ví dụ dưới đây để bắt đầu).
Câu trả lời gốc: Tôi vừa tạo một số rất sơ bộ mã để thực hiện việc này. Nó sau chính xác những gì Matt B. mô tả trong bình luận của mình. Hy vọng nó sẽ giúp, cho tôi biết nếu có vấn đề với nó.
https://github.com/ahwillia/Einsum.jl
Đây là cách bạn sẽ thực hiện ví dụ của bạn:
using Einsum
a = rand(10,10,10)
b = rand(10,10)
c = rand(10,10,10)
Q = zeros(10,10)
@einsum Q[i,j] = a[i,m,k]*b[m,l]*c[l,k,j]
Dưới mui xe vĩ mô xây dựng hàng loạt sau của lồng cho các vòng lặp và chèn chúng vào mã của bạn trước khi thời gian biên dịch. (Lưu ý đây không phải là mã chính xác chèn, nó cũng kiểm tra để chắc chắn rằng kích thước của các yếu tố đầu đồng ý, sử dụng macroexpand
để xem mã đầy đủ):
for j = 1:size(Q,2)
for i = 1:size(Q,1)
s = 0
for l = 1:size(b,2)
for k = 1:size(a,3)
for m = 1:size(a,2)
s += a[i,m,k] * b[m,l] * c[l,k,j]
end
end
end
Q[i,j] = s
end
end
lẽ [này thư viện hoạt động tensor] (https: // github.com/Jutho/TensorOperations.jl#index-notation) có thể hữu ích. Hãy nhớ rằng nó có vẻ bị bỏ rơi (cam kết mới nhất tháng 3 năm 2015 và hiện đang không xây dựng) –
Bạn rời khỏi 'c' từ phương trình. Việc triển khai 'python' phụ thuộc rất nhiều vào trình lặp' nditer'. – hpaulj
Chỉ cần lưu ý rằng 'einsum' có thể chưa được chuyển trực tiếp đến Julia đơn giản chỉ vì việc viết các vòng lặp của chính bạn cũng nhanh như vậy. Nếu tôi đã viết một cổng của nó, tôi có thể làm như vậy như là một vĩ mô để giải mã chuỗi subscript tại thời gian phân tích và trực tiếp mở rộng đến một loạt các vòng lặp (tương tự như cách '@ printf' hoạt động). –