1024 lines
80 KiB
HTML
1024 lines
80 KiB
HTML
|
|
<!DOCTYPE html>
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<title>mathematics — pylib 2019.5.19 documentation</title>
|
|
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
|
|
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
|
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
|
|
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
|
|
<script type="text/javascript" src="../_static/jquery.js"></script>
|
|
<script type="text/javascript" src="../_static/underscore.js"></script>
|
|
<script type="text/javascript" src="../_static/doctools.js"></script>
|
|
<script type="text/javascript" src="../_static/language_data.js"></script>
|
|
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
|
<link rel="index" title="Index" href="../genindex.html" />
|
|
<link rel="search" title="Search" href="../search.html" />
|
|
|
|
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
|
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
|
|
|
</head><body>
|
|
|
|
|
|
<div class="document">
|
|
<div class="documentwrapper">
|
|
<div class="bodywrapper">
|
|
|
|
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for mathematics</h1><div class="highlight"><pre>
|
|
<span></span><span class="ch">#!/usr/bin/env python</span>
|
|
<span class="c1"># -*- coding: utf-8 -*-</span>
|
|
<span class="sd">"""Mathematical functions and objects.</span>
|
|
|
|
<span class="sd">:Date: 2019-12-12</span>
|
|
|
|
<span class="sd">.. module:: mathematics</span>
|
|
<span class="sd"> :platform: *nix, Windows</span>
|
|
<span class="sd"> :synopsis: Mathematical functions and objects.</span>
|
|
|
|
<span class="sd">.. moduleauthor:: Daniel Weschke <daniel.weschke@directbox.de></span>
|
|
<span class="sd">"""</span>
|
|
<span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">gcd</span>
|
|
|
|
<div class="viewcode-block" id="lcm"><a class="viewcode-back" href="../mathematics.html#mathematics.lcm">[docs]</a><span class="k">def</span> <span class="nf">lcm</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
|
<span class="sd">"""Compute the lowest common multiple of a and b"""</span>
|
|
<span class="k">return</span> <span class="n">a</span><span class="o">/</span><span class="n">gcd</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span><span class="o">*</span><span class="n">b</span></div>
|
|
|
|
|
|
<div class="viewcode-block" id="vector"><a class="viewcode-back" href="../mathematics.html#mathematics.vector">[docs]</a><span class="k">class</span> <span class="nc">vector</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span>
|
|
<span class="sd">"""Use/create vector like lists</span>
|
|
|
|
<span class="sd"> * size -> len(a)</span>
|
|
<span class="sd"> * abs -> abs(a)</span>
|
|
<span class="sd"> * dot -> a * b</span>
|
|
<span class="sd"> * outer -> a @ b</span>
|
|
|
|
<span class="sd"> use super constructor</span>
|
|
|
|
<span class="sd"> use super __iter__</span>
|
|
|
|
<span class="sd"> use super __setitem__</span>
|
|
|
|
<span class="sd"> >>> v = vector([1,2,3,4,5])</span>
|
|
<span class="sd"> >>> v[3:5] = [1,2]</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [1, 2, 3, 1, 2]</span>
|
|
<span class="sd"> >>> isinstance(v, vector)</span>
|
|
<span class="sd"> True</span>
|
|
|
|
<span class="sd"> use super __lt__(a, b)</span>
|
|
|
|
<span class="sd"> use super __le__(a, b)</span>
|
|
|
|
<span class="sd"> use super __eq__(a, b)</span>
|
|
|
|
<span class="sd"> >>> v = vector([1,2,3,1,2])</span>
|
|
<span class="sd"> >>> v2 = vector([1,2,3,1,2])</span>
|
|
<span class="sd"> >>> v == v2</span>
|
|
<span class="sd"> True</span>
|
|
|
|
<span class="sd"> use super __ne__(a, b)</span>
|
|
|
|
<span class="sd"> use super __ge__(a, b)</span>
|
|
|
|
<span class="sd"> use super __gt__(a, b)</span>
|
|
|
|
<span class="sd"> use super __contains__</span>
|
|
|
|
<span class="sd"> >>> 2 in vector([1,2,3])</span>
|
|
<span class="sd"> True</span>
|
|
|
|
<span class="sd"> __isub__</span>
|
|
|
|
<span class="sd"> >>> v = vector([1,2,3])</span>
|
|
<span class="sd"> >>> v -= vector([3,3,3])</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [-2, -1, 0]</span>
|
|
|
|
<span class="sd"> __imul__</span>
|
|
|
|
<span class="sd"> >>> v = vector([1,2,3])</span>
|
|
<span class="sd"> >>> v *= vector([3,3,3])</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> 18</span>
|
|
|
|
<span class="sd"> __imatmul__</span>
|
|
|
|
<span class="sd"> >>> m = vector([1,2,3])</span>
|
|
<span class="sd"> >>> m *= vector([3,3,3])</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [[3, 3, 3], [6, 6, 6], [9, 9, 9]]</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> For index return value, for range return new vector object.</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> v = vector([1, 2, 3, 4, 5])</span>
|
|
<span class="sd"> >>> v[1:3]</span>
|
|
<span class="sd"> [2, 3]</span>
|
|
<span class="sd"> >>> v = vector([1, 2, 3, 4, 5])</span>
|
|
<span class="sd"> >>> v[3]</span>
|
|
<span class="sd"> 4</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># use the list.__getslice__ method and convert result to vector</span>
|
|
<span class="n">item</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="k">else</span> <span class="n">item</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__pos__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""+ a (new object)</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="o">*</span><span class="bp">self</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__neg__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sd">"""- a (new object)</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="o">-</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="sd">"""a + b (new object)</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> v = vector([1,2,3]) + vector([1,2,3])</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [2, 4, 6]</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">i</span><span class="o">+</span><span class="n">j</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">)])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__iadd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="sd">"""a += b (new object)</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> v = vector([1,2,3])</span>
|
|
<span class="sd"> >>> v += vector([3,3,3])</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [4, 5, 6]</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">i</span><span class="o">+</span><span class="n">j</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">)])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__sub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="sd">"""a - b (new object)</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> v = vector([1,2,3]) - vector([1,2,3])</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [0, 0, 0]</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">i</span><span class="o">-</span><span class="n">j</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">)])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Scalar multiplication, dot product (inner product) or</span>
|
|
<span class="sd"> vector-matrix multiplication.</span>
|
|
|
|
<span class="sd"> a * b (new object)</span>
|
|
|
|
<span class="sd"> :type other: scalar, vector (or 1d list), matrix (or 2d list)</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \mathbf{c} &= \mathbf{a} \cdot b \\</span>
|
|
<span class="sd"> \mathbf{c} &= \mathbf{a} \cdot \mathbf{b} \\</span>
|
|
<span class="sd"> \mathbf{c} &= \mathbf{a} \cdot \mathbf{B}</span>
|
|
|
|
<span class="sd"> .. note::</span>
|
|
<span class="sd"> No size checking will be conducted, therefore no exceptions for</span>
|
|
<span class="sd"> wrong usage (result will be nonsense).</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> v = vector([1,2,3,4,5])*3</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [3, 6, 9, 12, 15]</span>
|
|
<span class="sd"> >>> v = vector([1,2,3,4,5])*3.</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [3.0, 6.0, 9.0, 12.0, 15.0]</span>
|
|
<span class="sd"> >>> s = vector([1,2,3])*vector([1,2,3])</span>
|
|
<span class="sd"> >>> print(s)</span>
|
|
<span class="sd"> 14</span>
|
|
|
|
<span class="sd"> .. seealso::</span>
|
|
<span class="sd"> :meth:`__rmul__`</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">try</span><span class="p">:</span> <span class="c1"># vector * vector</span>
|
|
<span class="k">return</span> <span class="nb">sum</span><span class="p">([</span><span class="n">i</span><span class="o">*</span><span class="n">j</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">)])</span>
|
|
<span class="k">except</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span> <span class="c1"># vector * matrix</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span> <span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">other</span><span class="p">)])</span>
|
|
<span class="k">except</span><span class="p">:</span> <span class="c1"># vector * scalar</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">i</span><span class="o">*</span><span class="n">other</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Scalar multiplication, dot product (inner product) or</span>
|
|
<span class="sd"> matrix-vector multiplication.</span>
|
|
|
|
<span class="sd"> a * b (new object)</span>
|
|
|
|
<span class="sd"> :type other: scalar (or 1d list and 2d list)</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \mathbf{c} &= a \cdot \mathbf{b} \\</span>
|
|
<span class="sd"> \mathbf{c} &= \mathbf{a} \cdot \mathbf{b} \\</span>
|
|
<span class="sd"> \mathbf{c} &= \mathbf{A} \cdot \mathbf{b}</span>
|
|
|
|
<span class="sd"> .. note::</span>
|
|
<span class="sd"> No size checking will be conducted, therefore no exceptions for</span>
|
|
<span class="sd"> wrong usage (result will be nonsense).</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> v = 3*vector([1,2,3,4,5])</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [3, 6, 9, 12, 15]</span>
|
|
<span class="sd"> >>> v = 3.*vector([1,2,3,4,5])</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [3.0, 6.0, 9.0, 12.0, 15.0]</span>
|
|
|
|
<span class="sd"> .. seealso::</span>
|
|
<span class="sd"> :meth:`__mul__`</span>
|
|
<span class="sd"> :meth:`matrix.__mul__` for matrix * vector</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">try</span><span class="p">:</span> <span class="c1"># 2d list * vector (matrix * vector see matrix.__mul__)</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="bp">self</span><span class="p">))</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="n">other</span><span class="p">])</span>
|
|
<span class="k">except</span><span class="p">:</span> <span class="c1"># scalar * vector</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">*</span><span class="n">other</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__matmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Outer product a @ b (new object)</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \vec{a} \otimes \vec{b}</span>
|
|
<span class="sd"> =</span>
|
|
<span class="sd"> \begin{pmatrix}</span>
|
|
<span class="sd"> a_{1}\\</span>
|
|
<span class="sd"> a_{2}\\</span>
|
|
<span class="sd"> a_{3}</span>
|
|
<span class="sd"> \end{pmatrix}</span>
|
|
<span class="sd"> \otimes</span>
|
|
<span class="sd"> \begin{pmatrix}</span>
|
|
<span class="sd"> b_{1}\\</span>
|
|
<span class="sd"> b_{2}\\</span>
|
|
<span class="sd"> b_{3}</span>
|
|
<span class="sd"> \end{pmatrix}</span>
|
|
<span class="sd"> =</span>
|
|
<span class="sd"> \begin{pmatrix}</span>
|
|
<span class="sd"> a_{1}b_{1}&a_{1}b_{2}&a_{1}b_{3}\\</span>
|
|
<span class="sd"> a_{2}b_{1}&a_{2}b_{2}&a_{2}b_{3}\\</span>
|
|
<span class="sd"> a_{3}b_{1}&a_{3}b_{2}&a_{3}b_{3}</span>
|
|
<span class="sd"> \end{pmatrix}</span>
|
|
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> m = vector([1,2,3]) @ vector([1,2,4])</span>
|
|
<span class="sd"> >>> print(m)</span>
|
|
<span class="sd"> [[1, 2, 4], [2, 4, 8], [3, 6, 12]]</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">try</span><span class="p">:</span> <span class="c1"># vector * vector</span>
|
|
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="n">i</span><span class="o">*</span><span class="n">j</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">other</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
|
|
<span class="k">except</span><span class="p">:</span> <span class="c1"># vector * number</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">*</span><span class="n">other</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__abs__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Magnitude / norm of a vector</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> b = \sqrt{\sum a_i^2}</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> norm([3, 4])</span>
|
|
<span class="sd"> 5</span>
|
|
<span class="sd"> >>> norm(vector([3, 4]))</span>
|
|
<span class="sd"> 5</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">math</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="bp">self</span> <span class="o">*</span> <span class="bp">self</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">([</span><span class="o">*</span><span class="bp">self</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s2">"vector("</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="s2">")"</span>
|
|
|
|
<div class="viewcode-block" id="vector.full"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.full">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">full</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="n">fill_value</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a vector of length m or matrix of size m rows, n</span>
|
|
<span class="sd"> columns filled with v.</span>
|
|
|
|
<span class="sd"> :param length: length of the vector, e. g. 3</span>
|
|
<span class="sd"> :type length: int</span>
|
|
<span class="sd"> :param fill_value: Fill value</span>
|
|
<span class="sd"> :Type fill_value: scalar</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> v = vector.full(3, 7)</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [7, 7, 7]</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">fill_value</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">length</span><span class="p">)])</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.zeros"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.zeros">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">zeros</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a zero vector of length m or matrix of size rows, n</span>
|
|
<span class="sd"> columns filled with zeros.</span>
|
|
|
|
<span class="sd"> :param length: length of the vector, e. g. 3</span>
|
|
<span class="sd"> :type length: int</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> v = zeros(3)</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [0.0, 0.0, 0.0]</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="o">.</span><span class="n">full</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="mf">0.</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.ones"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.ones">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">ones</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a vector of length m or matrix of size rows, n</span>
|
|
<span class="sd"> columns filled with ones.</span>
|
|
|
|
<span class="sd"> :param length: lhape of the vector, e. g. 3</span>
|
|
<span class="sd"> :type length: int</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> v = ones(3)</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [1.0, 1.0, 1.0]</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="o">.</span><span class="n">full</span><span class="p">(</span><span class="n">length</span><span class="p">,</span> <span class="mf">1.</span><span class="p">)</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.random"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.random">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">random</span><span class="p">(</span><span class="n">shape</span><span class="p">,</span> <span class="n">lmin</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">lmax</span><span class="o">=</span><span class="mf">1.0</span><span class="p">):</span>
|
|
<span class="sd">"""Returns a random vector of length n or matrix of size m rows, n</span>
|
|
<span class="sd"> columns filled with random numbers.</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> v = random(3)</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [0.9172905912930438, 0.8908124278322492, 0.5256002790725927]</span>
|
|
<span class="sd"> >>> v = random(3, 1, 2)</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [1.2563665665080803, 1.9270454509964547, 1.2381672401270487]</span>
|
|
<span class="sd"> """</span>
|
|
<span class="kn">import</span> <span class="nn">random</span>
|
|
<span class="n">dl</span> <span class="o">=</span> <span class="n">lmax</span><span class="o">-</span><span class="n">lmin</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">dl</span><span class="o">*</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span><span class="o">+</span><span class="n">lmin</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">shape</span><span class="p">)])</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.normalize"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.normalize">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">normalize</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Normalize a vector (i. e. the vector has a length of 1)</span>
|
|
|
|
<span class="sd"> :type a: vector</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \vec{e}_a = \frac{\vec{a}}{|\vec{a}|}</span>
|
|
|
|
<span class="sd"> .. seealso::</span>
|
|
<span class="sd"> :meth:`norm` for a norm (magnitude) of a vector</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">a_mag</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">i</span><span class="o">/</span><span class="n">a_mag</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">])</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.ang"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.ang">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">ang</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">math</span><span class="o">.</span><span class="n">acos</span><span class="p">(</span><span class="n">a</span> <span class="o">*</span> <span class="n">b</span> <span class="o">/</span> <span class="p">(</span><span class="nb">abs</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">*</span> <span class="nb">abs</span><span class="p">(</span><span class="n">b</span><span class="p">)))</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.conjugate"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.conjugate">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">conjugate</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> New vector object</span>
|
|
|
|
<span class="sd"> :type a: list</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">i</span><span class="o">.</span><span class="n">conjugate</span><span class="p">()</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">])</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.re"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.re">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">re</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
|
<span class="sd">"""Return the real parts of a complex vector</span>
|
|
|
|
<span class="sd"> :type a: list</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">i</span><span class="o">.</span><span class="n">real</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">])</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.im"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.im">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">im</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
|
<span class="sd">"""Return the imaginary parts of a complex vector</span>
|
|
|
|
<span class="sd"> :type a: list</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">i</span><span class="o">.</span><span class="n">imag</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">])</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.abs"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.abs">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">abs</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
|
<span class="sd">"""Return modulus parts of a complex vector</span>
|
|
|
|
<span class="sd"> :type a: list</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">abs</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">])</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.arg"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.arg">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">arg</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
|
<span class="sd">"""Return phase parts of a complex vector</span>
|
|
|
|
<span class="sd"> :type a: list</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="n">math</span><span class="o">.</span><span class="n">atan2</span><span class="p">(</span><span class="n">i</span><span class="o">.</span><span class="n">imag</span><span class="p">,</span> <span class="n">i</span><span class="o">.</span><span class="n">real</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">a</span><span class="p">])</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.cross"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.cross">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">cross</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Cross product</span>
|
|
|
|
<span class="sd"> :type a: list</span>
|
|
<span class="sd"> :type b: list</span>
|
|
|
|
<span class="sd"> c is orthogonal to both a and b.</span>
|
|
<span class="sd"> The direction of c can be found with the right-hand rule.</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \vec{c} = \vec{a} \times \vec{b}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="p">[</span><span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
|
|
<span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span>
|
|
<span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">b</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.xyz"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.xyz">[docs]</a> <span class="k">def</span> <span class="nf">xyz</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.rotate_x"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.rotate_x">[docs]</a> <span class="k">def</span> <span class="nf">rotate_x</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Rotation about the x dirction.</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \begin{bmatrix}x' \\ y' \\ z' \\ h'\end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> 1 & 0 & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & \cos \theta & -\sin \theta & 0 \\</span>
|
|
<span class="sd"> 0 & \sin \theta & \cos \theta & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}x \\ y \\ z \\ h\end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">rx</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="bp">self</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.rotate_y"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.rotate_y">[docs]</a> <span class="k">def</span> <span class="nf">rotate_y</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Rotation about the y dirction.</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \begin{bmatrix}x' \\ y' \\ z' \\ h'\end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> \cos \theta & 0 & \sin \theta & 0 \\</span>
|
|
<span class="sd"> 0 & 1 & 0 & 0 \\</span>
|
|
<span class="sd"> -\sin \theta & 0 & \cos \theta & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}x \\ y \\ z \\ h\end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">ry</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="bp">self</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.rotate_z"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.rotate_z">[docs]</a> <span class="k">def</span> <span class="nf">rotate_z</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Rotation about the z dirction.</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \begin{bmatrix}x' \\ y' \\ z' \\ h'\end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> \cos \theta & -\sin \theta & 0 & 0 \\</span>
|
|
<span class="sd"> \sin \theta & \cos \theta & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 1 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}x \\ y \\ z \\ h\end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">rz</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="bp">self</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.translate"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.translate">[docs]</a> <span class="k">def</span> <span class="nf">translate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tz</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Translation</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \begin{bmatrix}x' \\ y' \\ z' \\ h'\end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> 1 & 0 & 0 & t_x \\</span>
|
|
<span class="sd"> 0 & 1 & 0 & t_y \\</span>
|
|
<span class="sd"> 0 & 0 & 1 & t_z \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}x \\ y \\ z \\ h\end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">t</span><span class="p">(</span><span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tz</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="bp">self</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.scale"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.scale">[docs]</a> <span class="k">def</span> <span class="nf">scale</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sz</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Scaling</span>
|
|
|
|
<span class="sd"> uniform scaling if sx=sy=sz=s.</span>
|
|
<span class="sd"> Note that scaling happens around the origin, so objects not</span>
|
|
<span class="sd"> centered at the origin will have their centers move. To avoid this,</span>
|
|
<span class="sd"> either scale the object when it's located at the origin, or</span>
|
|
<span class="sd"> perform a translation afterwards to move the object back to where</span>
|
|
<span class="sd"> it should be.</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \begin{bmatrix}x' \\ y' \\ z' \\ h'\end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> s_x & 0 & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & s_y & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & s_z & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}x \\ y \\ z \\ h\end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">sy</span><span class="p">:</span>
|
|
<span class="n">sy</span> <span class="o">=</span> <span class="n">sx</span>
|
|
<span class="n">sz</span> <span class="o">=</span> <span class="n">sx</span>
|
|
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">s</span><span class="p">(</span><span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="p">,</span> <span class="n">sz</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="bp">self</span></div>
|
|
|
|
<div class="viewcode-block" id="vector.ch_cs"><a class="viewcode-back" href="../mathematics.html#mathematics.vector.ch_cs">[docs]</a> <span class="k">def</span> <span class="nf">ch_cs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cs</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Transform this vector from its defined coordinate system to a</span>
|
|
<span class="sd"> new coordinate system, defined by the given coordinate system (u,</span>
|
|
<span class="sd"> v and w direction vectors).</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \begin{bmatrix}x' \\ y' \\ z' \\ h'\end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> u_x & u_y & u_z & 0 \\</span>
|
|
<span class="sd"> v_x & v_y & v_z & 0 \\</span>
|
|
<span class="sd"> w_x & w_y & w_z & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}x \\ y \\ z \\ h\end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">cs</span> <span class="o">*</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="bp">self</span></div></div>
|
|
|
|
<div class="viewcode-block" id="matrix"><a class="viewcode-back" href="../mathematics.html#mathematics.matrix">[docs]</a><span class="k">class</span> <span class="nc">matrix</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span>
|
|
<span class="sd">"""Use/create matrix like list of lists</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
|
|
<span class="sd">"""</span>
|
|
<span class="sd"> For index return value, for range return new vector object.</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> m = matrix([[1, 2, 3, 0], [4, 5, 6, 0], [7, 8, 9, 0], [0, 0, 0, 0]])</span>
|
|
<span class="sd"> >>> print(m[2])</span>
|
|
<span class="sd"> [7, 8, 9, 0]</span>
|
|
<span class="sd"> >>> print(m[:,1:3])</span>
|
|
<span class="sd"> [[2, 3], [5, 6], [8, 9], [0, 0]]</span>
|
|
<span class="sd"> >>> print(m[0:2,1:3])</span>
|
|
<span class="sd"> [[2, 3], [5, 6]]</span>
|
|
<span class="sd"> >>> print(m[::2,::2])</span>
|
|
<span class="sd"> [[1, 3], [7, 9]]</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># index: slice(stop), slice(start, stop[, step])</span>
|
|
<span class="c1"># for e. g. m[(1,3),:] -> index = ((1, 3), slice(None, None, None))</span>
|
|
<span class="c1"># use the list.__getslice__ method and convert result to vector</span>
|
|
<span class="k">try</span><span class="p">:</span> <span class="c1"># 2d slicing (tuple of sclices)</span>
|
|
<span class="n">item</span> <span class="o">=</span> <span class="p">[</span><span class="n">row</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span>
|
|
<span class="k">except</span><span class="p">:</span> <span class="c1"># 1d slicing</span>
|
|
<span class="n">item</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__getitem__</span><span class="p">(</span><span class="n">index</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">matrix</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="k">else</span> <span class="n">item</span>
|
|
|
|
<div class="viewcode-block" id="matrix.rx"><a class="viewcode-back" href="../mathematics.html#mathematics.matrix.rx">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">rx</span><span class="p">(</span><span class="n">theta</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Rotation matrix about the x direction.</span>
|
|
|
|
<span class="sd"> Rotates the coordinate system of vectors</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> R_{x}(\theta) =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> 1 & 0 & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & \cos \theta & -\sin \theta & 0 \\</span>
|
|
<span class="sd"> 0 & \sin \theta & \cos \theta & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
|
|
<span class="n">c</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
|
|
<span class="n">T</span> <span class="o">=</span> <span class="n">matrix</span><span class="p">([[</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span><span class="o">-</span><span class="n">s</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
|
|
<span class="k">return</span> <span class="n">T</span></div>
|
|
|
|
<div class="viewcode-block" id="matrix.ry"><a class="viewcode-back" href="../mathematics.html#mathematics.matrix.ry">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">ry</span><span class="p">(</span><span class="n">theta</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Rotation matrix about the y direction.</span>
|
|
|
|
<span class="sd"> Rotates the coordinate system of vectors</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> R_{y}(\theta) =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> \cos \theta & 0 & \sin \theta & 0 \\</span>
|
|
<span class="sd"> 0 & 1 & 0 & 0 \\</span>
|
|
<span class="sd"> -\sin \theta & 0 & \cos \theta & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
|
|
<span class="n">c</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
|
|
<span class="n">T</span> <span class="o">=</span> <span class="n">matrix</span><span class="p">([[</span> <span class="n">c</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span><span class="o">-</span><span class="n">s</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
|
|
<span class="k">return</span> <span class="n">T</span></div>
|
|
|
|
<div class="viewcode-block" id="matrix.rz"><a class="viewcode-back" href="../mathematics.html#mathematics.matrix.rz">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">rz</span><span class="p">(</span><span class="n">theta</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Rotation matrix about the z direction.</span>
|
|
|
|
<span class="sd"> Rotates the coordinate system of vectors</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> R_{z}(\theta) =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> \cos \theta & -\sin \theta & 0 & 0 \\</span>
|
|
<span class="sd"> \sin \theta & \cos \theta & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 1 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> R_{z}(\theta) \begin{bmatrix}1 \\ 0 \\ 0 \\ 1\end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> \cos 90° & -\sin 90° & 0 & 0 \\</span>
|
|
<span class="sd"> \sin 90° & \cos 90° & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 1 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}1 \\ 0 \\ 0 \\ 1\end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> 0 & -1 & 0 & 0 \\</span>
|
|
<span class="sd"> 1 & 0 & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 1 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}1 \\ 0 \\ 0 \\ 1\end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}0 \\ 1 \\ 0 \\ 1\end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
|
|
<span class="n">c</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span>
|
|
<span class="n">T</span> <span class="o">=</span> <span class="n">matrix</span><span class="p">([[</span> <span class="n">c</span><span class="p">,</span><span class="o">-</span><span class="n">s</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="n">s</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
|
|
<span class="k">return</span> <span class="n">T</span></div>
|
|
|
|
<div class="viewcode-block" id="matrix.t"><a class="viewcode-back" href="../mathematics.html#mathematics.matrix.t">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">t</span><span class="p">(</span><span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tz</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Translation matrix</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> T =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> 1 & 0 & 0 & t_x \\</span>
|
|
<span class="sd"> 0 & 1 & 0 & t_y \\</span>
|
|
<span class="sd"> 0 & 0 & 1 & t_z \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">T</span> <span class="o">=</span> <span class="n">matrix</span><span class="p">([[</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span><span class="n">tx</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span><span class="n">ty</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span><span class="n">tz</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
|
|
<span class="k">return</span> <span class="n">T</span></div>
|
|
|
|
<div class="viewcode-block" id="matrix.s"><a class="viewcode-back" href="../mathematics.html#mathematics.matrix.s">[docs]</a> <span class="nd">@staticmethod</span>
|
|
<span class="k">def</span> <span class="nf">s</span><span class="p">(</span><span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sz</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Scaling matrix</span>
|
|
|
|
<span class="sd"> uniform scaling if sx=sy=sz=s.</span>
|
|
<span class="sd"> Note that scaling happens around the origin, so objects not</span>
|
|
<span class="sd"> centered at the origin will have their centers move. To avoid this,</span>
|
|
<span class="sd"> either scale the object when it's located at the origin, or</span>
|
|
<span class="sd"> perform a translation afterwards to move the object back to where</span>
|
|
<span class="sd"> it should be.</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> S =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> s_x & 0 & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & s_y & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & s_z & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">sy</span><span class="p">:</span>
|
|
<span class="n">sy</span> <span class="o">=</span> <span class="n">sx</span>
|
|
<span class="n">sz</span> <span class="o">=</span> <span class="n">sx</span>
|
|
<span class="n">T</span> <span class="o">=</span> <span class="n">matrix</span><span class="p">([[</span><span class="n">sx</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span><span class="n">sy</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span><span class="n">sz</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
|
|
<span class="p">[</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
|
|
<span class="k">return</span> <span class="n">T</span></div>
|
|
|
|
<span class="k">def</span> <span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Scalar multiplication, dot product (inner product) or</span>
|
|
<span class="sd"> matrix-vector multiplication.</span>
|
|
|
|
<span class="sd"> a * b (new object)</span>
|
|
|
|
<span class="sd"> :type other: scalar, vector (or 1d list), matrix (or 2d list)</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \mathbf{C} &= \mathbf{A} \cdot b \\</span>
|
|
<span class="sd"> \mathbf{c} &= \mathbf{A} \cdot \mathbf{b} \\</span>
|
|
<span class="sd"> \mathbf{C} &= \mathbf{A} \cdot \mathbf{B}</span>
|
|
|
|
<span class="sd"> .. note::</span>
|
|
<span class="sd"> No size checking will be conducted, therefore no exceptions for</span>
|
|
<span class="sd"> wrong usage (result will be nonsense).</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [0, 0, 0, 1]]) * 5</span>
|
|
<span class="sd"> >>> print(m)</span>
|
|
<span class="sd"> [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]</span>
|
|
<span class="sd"> >>> m = matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [0, 0, 0, 1]]) * 5.</span>
|
|
<span class="sd"> >>> print(m)</span>
|
|
<span class="sd"> [[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]</span>
|
|
<span class="sd"> >>> v = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * vector([12, 12, 13])</span>
|
|
<span class="sd"> >>> print(v)</span>
|
|
<span class="sd"> [75, 186, 297]</span>
|
|
<span class="sd"> >>> m = matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) * matrix([[12, 12, 13], [14, 15, 16], [17, 18, 19]])</span>
|
|
<span class="sd"> >>> print(m)</span>
|
|
<span class="sd"> [[91, 96, 102], [220, 231, 246], [349, 366, 390]]</span>
|
|
|
|
<span class="sd"> .. seealso::</span>
|
|
<span class="sd"> :meth:`__rmul__`</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">try</span><span class="p">:</span> <span class="c1"># matrix * matrix</span>
|
|
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span> <span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="n">other</span><span class="p">)]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
|
|
<span class="k">except</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span> <span class="c1"># matrix * vector</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">other</span><span class="p">))</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
|
|
<span class="k">except</span><span class="p">:</span> <span class="c1"># matrix * scalar</span>
|
|
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="n">a</span><span class="o">*</span><span class="n">other</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">a_row</span><span class="p">]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__rmul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Scalar multiplication, dot product (inner product) or</span>
|
|
<span class="sd"> vector-matrix multiplication.</span>
|
|
|
|
<span class="sd"> a * b (new object)</span>
|
|
|
|
<span class="sd"> :type other: scalar (or 1d list and 2d list)</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \mathbf{C} &= a \cdot \mathbf{B} \\</span>
|
|
<span class="sd"> \mathbf{c} &= \mathbf{a} \cdot \mathbf{B} \\</span>
|
|
<span class="sd"> \mathbf{C} &= \mathbf{A} \cdot \mathbf{B}</span>
|
|
|
|
<span class="sd"> .. note::</span>
|
|
<span class="sd"> No size checking will be conducted, therefore no exceptions for</span>
|
|
<span class="sd"> wrong usage (result will be nonsense).</span>
|
|
|
|
<span class="sd"> :Example:</span>
|
|
|
|
<span class="sd"> >>> m = 5 * matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [0, 0, 0, 1]]) * 5</span>
|
|
<span class="sd"> >>> print(m)</span>
|
|
<span class="sd"> [[5, 10, 15, 20], [25, 30, 35, 40], [45, 50, 55, 60], [0, 0, 0, 5]]</span>
|
|
<span class="sd"> >>> m = 5. * matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [0, 0, 0, 1]])</span>
|
|
<span class="sd"> >>> print(m)</span>
|
|
<span class="sd"> [[5.0, 10.0, 15.0, 20.0], [25.0, 30.0, 35.0, 40.0], [45.0, 50.0, 55.0, 60.0], [0.0, 0.0, 0.0, 5.0]]</span>
|
|
|
|
<span class="sd"> .. seealso::</span>
|
|
<span class="sd"> :meth:`__mul__`</span>
|
|
<span class="sd"> :meth:`vector.__mul__` for vector * matrix</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">try</span><span class="p">:</span> <span class="c1"># 2d list * matrix (matrix * matrix see matrix.__mul__)</span>
|
|
<span class="k">return</span> <span class="n">matrix</span><span class="p">([[</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a_row</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span> <span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="p">)]</span> <span class="k">for</span> <span class="n">a_row</span> <span class="ow">in</span> <span class="n">other</span><span class="p">])</span>
|
|
<span class="k">except</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span> <span class="c1"># 1d list * matrix (vector * matrix see vector.__mul__)</span>
|
|
<span class="k">return</span> <span class="n">vector</span><span class="p">([</span><span class="nb">sum</span><span class="p">(</span><span class="n">c</span><span class="o">*</span><span class="n">d</span> <span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">b_col</span><span class="p">))</span> <span class="k">for</span> <span class="n">b_col</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="p">)])</span>
|
|
<span class="k">except</span><span class="p">:</span> <span class="c1"># scalar * vector</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">*</span><span class="n">other</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">str</span><span class="p">([</span><span class="o">*</span><span class="bp">self</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s2">"matrix("</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">+</span> <span class="s2">")"</span>
|
|
|
|
<div class="viewcode-block" id="matrix.rotate_x"><a class="viewcode-back" href="../mathematics.html#mathematics.matrix.rotate_x">[docs]</a> <span class="k">def</span> <span class="nf">rotate_x</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Rotation about the x dirction.</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> xx & xy & xz & t_x \\</span>
|
|
<span class="sd"> yx' & yy' & yz' & t_y' \\</span>
|
|
<span class="sd"> zx' & zy' & zz' & t_z' \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> 1 & 0 & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & \cos \theta & -\sin \theta & 0 \\</span>
|
|
<span class="sd"> 0 & \sin \theta & \cos \theta & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> xx & xy & xz & t_x \\</span>
|
|
<span class="sd"> yx & yy & yz & t_y \\</span>
|
|
<span class="sd"> zx & zy & zz & t_z \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">rx</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="bp">self</span></div>
|
|
|
|
<div class="viewcode-block" id="matrix.rotate_y"><a class="viewcode-back" href="../mathematics.html#mathematics.matrix.rotate_y">[docs]</a> <span class="k">def</span> <span class="nf">rotate_y</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Rotation about the y dirction.</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> xx' & xy' & xz' & t_x' \\</span>
|
|
<span class="sd"> yx & yy & yz & t_y \\</span>
|
|
<span class="sd"> zx' & zy' & zz' & t_z' \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> \cos \theta & 0 & \sin \theta & 0 \\</span>
|
|
<span class="sd"> 0 & 1 & 0 & 0 \\</span>
|
|
<span class="sd"> -\sin \theta & 0 & \cos \theta & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> xx & xy & xz & t_x \\</span>
|
|
<span class="sd"> yx & yy & yz & t_y \\</span>
|
|
<span class="sd"> zx & zy & zz & t_z \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">ry</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="bp">self</span></div>
|
|
|
|
<div class="viewcode-block" id="matrix.rotate_z"><a class="viewcode-back" href="../mathematics.html#mathematics.matrix.rotate_z">[docs]</a> <span class="k">def</span> <span class="nf">rotate_z</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">theta</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Rotation about the z dirction.</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> xx' & xy' & xz' & t_x' \\</span>
|
|
<span class="sd"> yx' & yy' & yz' & t_y' \\</span>
|
|
<span class="sd"> zx & zy & zz & t_z \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> \cos \theta & -\sin \theta & 0 & 0 \\</span>
|
|
<span class="sd"> \sin \theta & \cos \theta & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 1 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> xx & xy & xz & t_x \\</span>
|
|
<span class="sd"> yx & yy & yz & t_y \\</span>
|
|
<span class="sd"> zx & zy & zz & t_z \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">rz</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="bp">self</span></div>
|
|
|
|
<div class="viewcode-block" id="matrix.translate"><a class="viewcode-back" href="../mathematics.html#mathematics.matrix.translate">[docs]</a> <span class="k">def</span> <span class="nf">translate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tz</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Translation</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> xx & xy & xz & t_x' \\</span>
|
|
<span class="sd"> yx & yy & yz & t_y' \\</span>
|
|
<span class="sd"> zx & zy & zz & t_z' \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> 1 & 0 & 0 & t_x \\</span>
|
|
<span class="sd"> 0 & 1 & 0 & t_y \\</span>
|
|
<span class="sd"> 0 & 0 & 1 & t_z \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> xx & xy & xz & t_x \\</span>
|
|
<span class="sd"> yx & yy & yz & t_y \\</span>
|
|
<span class="sd"> zx & zy & zz & t_z \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">t</span><span class="p">(</span><span class="n">tx</span><span class="p">,</span> <span class="n">ty</span><span class="p">,</span> <span class="n">tz</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="bp">self</span></div>
|
|
|
|
<div class="viewcode-block" id="matrix.scale"><a class="viewcode-back" href="../mathematics.html#mathematics.matrix.scale">[docs]</a> <span class="k">def</span> <span class="nf">scale</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sz</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="sa">r</span><span class="sd">"""Scaling</span>
|
|
|
|
<span class="sd"> uniform scaling if sx=sy=sz=s.</span>
|
|
<span class="sd"> Note that scaling happens around the origin, so objects not</span>
|
|
<span class="sd"> centered at the origin will have their centers move. To avoid this,</span>
|
|
<span class="sd"> either scale the object when it's located at the origin, or</span>
|
|
<span class="sd"> perform a translation afterwards to move the object back to where</span>
|
|
<span class="sd"> it should be.</span>
|
|
|
|
<span class="sd"> .. math::</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> xx' & xy' & xz' & t_x' \\</span>
|
|
<span class="sd"> yx' & yy' & yz' & t_y' \\</span>
|
|
<span class="sd"> zx' & zy' & zz' & t_z' \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix} =</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> s_x & 0 & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & s_y & 0 & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & s_z & 0 \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & 1</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> \begin{bmatrix}</span>
|
|
<span class="sd"> xx & xy & xz & t_x \\</span>
|
|
<span class="sd"> yx & yy & yz & t_y \\</span>
|
|
<span class="sd"> zx & zy & zz & t_z \\</span>
|
|
<span class="sd"> 0 & 0 & 0 & h</span>
|
|
<span class="sd"> \end{bmatrix}</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">sy</span><span class="p">:</span>
|
|
<span class="n">sy</span> <span class="o">=</span> <span class="n">sx</span>
|
|
<span class="n">sz</span> <span class="o">=</span> <span class="n">sx</span>
|
|
<span class="bp">self</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">s</span><span class="p">(</span><span class="n">sx</span><span class="p">,</span> <span class="n">sy</span><span class="p">,</span> <span class="n">sz</span><span class="p">)</span> <span class="o">*</span> <span class="bp">self</span>
|
|
<span class="k">return</span> <span class="bp">self</span></div></div>
|
|
</pre></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|
<div class="sphinxsidebarwrapper">
|
|
<h1 class="logo"><a href="../index.html">pylib</a></h1>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h3>Navigation</h3>
|
|
|
|
<div class="relations">
|
|
<h3>Related Topics</h3>
|
|
<ul>
|
|
<li><a href="../index.html">Documentation overview</a><ul>
|
|
<li><a href="index.html">Module code</a><ul>
|
|
</ul></li>
|
|
</ul></li>
|
|
</ul>
|
|
</div>
|
|
<div id="searchbox" style="display: none" role="search">
|
|
<h3 id="searchlabel">Quick search</h3>
|
|
<div class="searchformwrapper">
|
|
<form class="search" action="../search.html" method="get">
|
|
<input type="text" name="q" aria-labelledby="searchlabel" />
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">$('#searchbox').show(0);</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
</div>
|
|
<div class="clearer"></div>
|
|
</div>
|
|
<div class="footer">
|
|
©2019, Daniel Weschke.
|
|
|
|
|
|
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.1</a>
|
|
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</body>
|
|
</html> |