X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/09ea57eaca41d79ad9bbda34249860f786600f0b..d02fe47dd3be7310d1bfd6e802d1fac2ea5f5e9d:/lisp/calc/calc-vec.el diff --git a/lisp/calc/calc-vec.el b/lisp/calc/calc-vec.el index 3ec387053c..c079e8985e 100644 --- a/lisp/calc/calc-vec.el +++ b/lisp/calc/calc-vec.el @@ -1,27 +1,27 @@ ;;; calc-vec.el --- vector functions for Calc ;; Copyright (C) 1990, 1991, 1992, 1993, 2001, 2002, 2003, 2004, -;; 2005, 2006 Free Software Foundation, Inc. +;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. ;; Author: David Gillespie -;; Maintainer: Jay Belanger +;; Maintainer: Jay Belanger ;; This file is part of GNU Emacs. +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + ;; GNU Emacs is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY. No author or distributor -;; accepts responsibility to anyone for the consequences of using it -;; or for whether it serves any particular purpose or works at all, -;; unless he says so in writing. Refer to the GNU Emacs General Public -;; License for full details. - -;; Everyone is granted permission to copy, modify and redistribute -;; GNU Emacs, but only under the conditions described in the -;; GNU Emacs General Public License. A copy of this license is -;; supposed to have been given to you along with GNU Emacs so you -;; can know your rights and responsibilities. It should be in a -;; file named COPYING. Among other things, the copyright notice -;; and this notice must be preserved on all copies. +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Commentary: @@ -32,6 +32,10 @@ (require 'calc-ext) (require 'calc-macs) +;; Declare functions which are defined elsewhere. +(declare-function math-read-expr-level "calc-aent" (exp-prec &optional exp-term)) + + (defun calc-display-strings (n) (interactive "P") (calc-wrapper @@ -475,6 +479,11 @@ (calc-wrapper (calc-binary-op "cros" 'calcFunc-cross arg))) +(defun calc-kron (arg) + (interactive "P") + (calc-wrapper + (calc-binary-op "kron" 'calcFunc-kron arg))) + (defun calc-remove-duplicates (arg) (interactive "P") (calc-wrapper @@ -1462,6 +1471,41 @@ (math-reject-arg a "*Three-vector expected"))) +;;; Compute a Kronecker product +(defun calcFunc-kron (x y &optional nocheck) + "The Kronecker product of objects X and Y. +The objects X and Y may be scalars, vectors or matrices. +The type of the result depends on the types of the operands; +the product of two scalars is a scalar, +of one scalar and a vector is a vector, +of two vectors is a vector. +of one vector and a matrix is a matrix, +of two matrices is a matrix." + (unless nocheck + (cond ((or (math-matrixp x) + (math-matrixp y)) + (unless (math-matrixp x) + (setq x (if (math-vectorp x) + (list 'vec x) + (list 'vec (list 'vec x))))) + (unless (math-matrixp y) + (setq y (if (math-vectorp y) + (list 'vec y) + (list 'vec (list 'vec y)))))) + ((or (math-vectorp x) + (math-vectorp y)) + (unless (math-vectorp x) + (setq x (list 'vec x))) + (unless (math-vectorp y) + (setq y (list 'vec y)))))) + (if (math-vectorp x) + (let (ret) + (dolist (v (cdr x)) + (dolist (w (cdr y)) + (setq ret (cons (calcFunc-kron v w t) ret)))) + (cons 'vec (nreverse ret))) + (math-mul x y))) + ;; The variable math-rb-close is local to math-read-brackets, but ;; is used by math-read-vector, which is called (directly and @@ -1593,5 +1637,5 @@ (provide 'calc-vec) -;;; arch-tag: 7902a7af-ec69-440a-8635-ebb4db263402 +;; arch-tag: 7902a7af-ec69-440a-8635-ebb4db263402 ;;; calc-vec.el ends here