2013-11-14 14 views
5

Questa sembra una domanda stupida, ma non riesco a capirlo dopo un po 'di guardarmi intorno, quindi chiederò qui.moltiplicazione matrice in core.matrix

Come posso moltiplicare una matrice 3x2 con una matrice 2x3 in core.matrix? Devo essere fraintendendo qualcosa di molto semplice. Ingenuamente, mi aspettavo che funzionasse e pensavo che core.matrix avrebbe fatto la matematica sottostante per me.

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

Ho trovato questo esempio tramite primo successo su una ricerca su google http://www.purplemath.com/modules/mtrxmult.htm e il risultato atteso è

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

Invece, ottengo:

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

Grazie in anticipo.

p.s. mio namespace appare come nell'esempio da core.matrix

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

risposta

9

L'operatore matriciale * è una moltiplicazione elemento-saggio - cioè, costringe i due operandi verso le stesse dimensioni e produce una nuova matrice in cui l'elemento a ogni posizione nel risultato è il prodotto degli elementi in quella posizione negli operandi.

Penso che stiate cercando la funzione mmul da clojure.core.matrix.

+0

In effetti hai ragione. Grazie! (mmul (matrice [[1 0 -2] [0 3 -1]]) (matrice [[0 3] [-2 -1] [0 4]])) ==> [[0 -5 ] [-6 -7]] –

+4

Un'opzione da considerare è saltare il passo di tirare la definizione di matrice di '*' nel proprio spazio dei nomi, e basta usare 'emul' insieme a' mmul'. In questo modo, non c'è alcuna possibilità di dimenticare cosa significa "*" nel codice, o di chiedersi se le variabili moltiplicate contengano numeri o matrici. Ritengo che se non definisco funzioni che voglio essere in grado di applicare a matrici e numeri, l'uso di operatori aritmetici sovraccarichi sembra interessante ma potrebbe confondere i lettori (come me) e portare a bug. Questa è una questione di preferenze personali, però. – Mars

+0

@Mars Sono d'accordo al 100%, soprattutto quando si tratta di funzioni definite in clojure.core. Quel codice, quando copiato in un nuovo spazio dei nomi, potrebbe ancora compilare, ma significa qualcosa di completamente diverso. – Alex

Problemi correlati