2015-08-19 13 views
5

Đến từ số này question, tôi tự hỏi liệu có phải một einsum tổng quát hơn có thể thực hiện được hay không. Giả sử, tôi gặp sự cốnumpy.einsum cho Julia? (2)

using PyCall 
@pyimport numpy as np 

a = rand(10,10,10) 
b = rand(10,10) 
c = rand(10,10,10) 

Q = np.einsum("imk,ml,lkj->ij", a,b,c) 

Hoặc điều gì đó tương tự, làm cách nào để giải quyết vấn đề này mà không cần lặp lại số tiền?

với Trân

+1

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) –

+0

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

+1

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). –

Trả lời

3

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 
+0

@varantir nếu điều này trả lời câu hỏi của bạn, vui lòng đánh dấu câu hỏi là đã trả lời. Cảm ơn! –