2013-11-14 46 views
5

Điều này có vẻ như một câu hỏi ngớ ngẩn, nhưng tôi không thể tìm ra điều này sau một chút nhìn xung quanh, vì vậy tôi sẽ hỏi ở đây.ma trận phép nhân trong core.matrix

Làm cách nào để nhân một ma trận 3x2 bằng ma trận 2x3 trong core.matrix? Tôi phải hiểu lầm điều gì đó rất cơ bản. Naively, tôi mong đợi điều này để làm việc và tôi nghĩ core.matrix sẽ làm toán học cơ bản cho tôi.

(* (matrix [[1 0 -2] 
      [0 3 -1]]) 
    (matrix [[0 3] 
      [-2 -1] 
      [0 4]])) 

tôi thấy ví dụ này qua hit đầu tiên trên một tìm kiếm google http://www.purplemath.com/modules/mtrxmult.htm và kết quả mong đợi là

[[ 0 -5] 
[-6 -7]] 

Thay vào đó, tôi nhận được:

RuntimeException Incompatible shapes, cannot broadcast [3 2] to [2 3] 
clojure.core.matrix.impl.persistent-vector/eval5013/fn--5014 
(persistent_vector.clj:152) 

Cảm ơn trước.

p.s. namespace của tôi trông giống như ví dụ từ core.matrix

(ns xyz 
    (:refer-clojure :exclude [* - + == /]) ; get from core.matrix 
    (:use clojure.core.matrix) 
    (:use clojure.core.matrix.operators) 
    (:gen-class)) 

Trả lời

9

Nhà điều hành ma trận * là một nhân tố khôn ngoan - có nghĩa là, nó buộc hai toán hạng để kích thước tương tự và tạo ra một ma trận mới, nơi các phần tử ở mỗi vị trí trong kết quả là sản phẩm của các phần tử tại vị trí đó trong các toán hạng.

Tôi nghĩ bạn đang tìm kiếm hàm mmul từ clojure.core.matrix.

+0

Thực tế là bạn đã chính xác. Cảm ơn! (mmul (ma trận [[1 0 -2] [0 3 -1]]) (ma trận [[0 3] [-2 -1] [0 4]])) ==> [[0 -5 ] [-6 -7]] –

+4

Một tùy chọn để xem xét là bỏ qua bước kéo định nghĩa ma trận của '*' vào không gian tên của bạn, và chỉ sử dụng 'emul' cùng với' mmul'. Bằng cách đó, không có cơ hội quên '*' có nghĩa là gì trong mã của bạn, hoặc tự hỏi liệu các biến nhân có giữ số hay ma trận hay không. Tôi cảm thấy rằng nếu tôi không định nghĩa các hàm mà tôi muốn có thể áp dụng cho cả ma trận và số, thì việc sử dụng toán tử số học quá tải có vẻ thú vị nhưng có thể gây nhầm lẫn cho người đọc (như tôi) và dẫn đến lỗi. Đây là một vấn đề sở thích cá nhân, mặc dù. – Mars

+0

@Mar Tôi đồng ý 100%, đặc biệt là khi nói đến các hàm được định nghĩa trong clojure.core. Mã đó, khi được sao chép vào một không gian tên mới, vẫn có thể biên dịch nhưng có nghĩa là một cái gì đó hoàn toàn khác. – Alex

Các vấn đề liên quan