|
|
@@ -1,514 +0,0 @@
|
|
|
-/*
|
|
|
- * @author Ranides Atterwim <ranides@gmail.com>
|
|
|
- * @copyright Ranides Atterwim
|
|
|
- * @license WTFPL
|
|
|
- * @url http://ranides.net/projects/twshelper
|
|
|
- */
|
|
|
-package net.ranides.assira.math;
|
|
|
-
|
|
|
-import java.util.Locale;
|
|
|
-
|
|
|
-/**
|
|
|
- *
|
|
|
- * @author ranides
|
|
|
- */
|
|
|
-@SuppressWarnings({"PMD.ShortVar", "PMD.AvoidArrayLoops"})
|
|
|
-public final class MathVectors {
|
|
|
-
|
|
|
- private MathVectors() {
|
|
|
- // utility class
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Wywołuje na rzecz każdego elementu metodę {@link Math#floor} i zakrągla do liczby
|
|
|
- * całkowitej.
|
|
|
- * @param a
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static int[] floor(double[] a) {
|
|
|
- int[] result = new int[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = (int)Math.floor(a[i]); }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Wywołuje na rzecz każdego elementu metodę {@link Math#ceil} i zakrągla do liczby
|
|
|
- * całkowitej.
|
|
|
- * @param a
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static int[] ceil(double[] a) {
|
|
|
- int[] result = new int[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = (int)Math.ceil(a[i]); }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Konwertuje podaną tablicę liczb całkowitych na tablicę liczb rzeczywistych.
|
|
|
- * @param a
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] real(int[] a) {
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
-/* ************************************************************************** */
|
|
|
-
|
|
|
- /**
|
|
|
- * Dodaje odpowiednie elementy z tablicy {@code a} do elementów z tablicy
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie sumy.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] add(double[] a, double[] b) {
|
|
|
- assert a.length == b.length;
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] + b[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Dodaje do wszystkich elementów z tablicy {@code a} liczbę {@code b}.
|
|
|
- * Jako wynik zwraca tablicę zawierającą odpowiednie sumy.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] add(double[] a, double b) {
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] + b; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Dodaje odpowiednie elementy z tablicy {@code a} do elementów z tablicy
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie sumy.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static int[] add(int[] a, int[] b) {
|
|
|
- assert a.length == b.length;
|
|
|
- int[] result = new int[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] + b[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Dodaje do wszystkich elementów z tablicy {@code a} liczbę {@code b}.
|
|
|
- * Jako wynik zwraca tablicę zawierającą odpowiednie sumy.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static int[] add(int[] a, int b) {
|
|
|
- int[] result = new int[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] + b; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Odejmuje od odpowiednich elementów z tablicy {@code a} elementy z tablicy
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie różnice.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] sub(double[] a, double[] b) {
|
|
|
- assert a.length == b.length;
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] - b[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Odejmuje od wszystkich elementów z tablicy {@code a} liczbę {@code b}.
|
|
|
- * Jako wynik zwraca tablicę zawierającą odpowiednie różnice.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] sub(double[] a, double b) {
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] - b; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Odejmuje od odpowiednich elementów z tablicy {@code a} elementy z tablicy
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie różnice.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static int[] sub(int[] a, int[] b) {
|
|
|
- assert a.length == b.length;
|
|
|
- int[] result = new int[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] - b[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Odejmuje od wszystkich elementów z tablicy {@code a} liczbę {@code b}.
|
|
|
- * Jako wynik zwraca tablicę zawierającą odpowiednie różnice.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static int[] sub(int[] a, int b) {
|
|
|
- int[] result = new int[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] - b; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Dzieli odpowiednie elementy z tablicy {@code a} przez elementy z tablicy
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie ilorazy.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] div(double[] a, double[] b) {
|
|
|
- assert a.length == b.length;
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] / b[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Dzieli wszystkie elementy z tablicy {@code a} przez liczbę
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie ilorazy.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] div(double[] a, double b) {
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] / b; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Dzieli odpowiednie elementy z tablicy {@code a} przez elementy z tablicy
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie ilorazy.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] div(int[] a, int[] b) {
|
|
|
- assert a.length == b.length;
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = (double)a[i] / (double)b[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Dzieli wszystkie elementy z tablicy {@code a} przez liczbę
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie ilorazy.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] div(int[] a, double b) {
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] / b; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Mnoży odpowiednie elementy z tablicy {@code a} przez elementy z tablicy
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie iloczyny.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] mul(double[] a, double[] b) {
|
|
|
- assert a.length == b.length;
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] * b[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Mnoży wszystkie elementy z tablicy {@code a} przez liczbę
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie iloczyny.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] mul(double[] a, double b) {
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] / b; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Mnoży odpowiednie elementy z tablicy {@code a} przez elementy z tablicy
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie iloczyny.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static int[] mul(int[] a, int[] b) {
|
|
|
- assert a.length == b.length;
|
|
|
- int[] result = new int[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] * b[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Mnoży wszystkie elementy z tablicy {@code a} przez liczbę
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie iloczyny.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static int[] mul(int[] a, int b) {
|
|
|
- int[] result = new int[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] / b; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * Oblicza resztę z dzielenia odpowiednich elementów z tablicy {@code a} przez elementy z tablicy
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie reszty.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] mod(double[] a, double[] b) {
|
|
|
- assert a.length == b.length;
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] % b[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Oblicza resztę z dzielenia wszystkich elementów z tablicy {@code a} przez liczbę
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie reszty.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double[] mod(double[] a, double b) {
|
|
|
- double[] result = new double[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] % b; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Oblicza resztę z dzielenia odpowiednich elementów z tablicy {@code a} przez elementy z tablicy
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie reszty.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static int[] mod(int[] a, int[] b) {
|
|
|
- assert a.length == b.length;
|
|
|
- int[] result = new int[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] % b[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Oblicza resztę z dzielenia wszystkich elementów z tablicy {@code a} przez liczbę
|
|
|
- * {@code b}. Jako wynik zwraca tablicę zawierającą odpowiednie reszty.
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static int[] mod(int[] a, int b) {
|
|
|
- int[] result = new int[a.length];
|
|
|
- for(int i=0; i<a.length; i++) { result[i] = a[i] % b; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
-/* ************************************************************************** */
|
|
|
-
|
|
|
- /**
|
|
|
- * Dodaje wszystkie elementy podanej tablicy. Jako wynik zwraca obliczoną sumę.
|
|
|
- * @param a
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double sum(double[] a) {
|
|
|
- double result = 0;
|
|
|
- for(int i=0; i<a.length; i++) { result += a[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Dodaje wszystkie elementy podanej tablicy. Jako wynik zwraca obliczoną sumę.
|
|
|
- * @param a
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static int sum(int[] a) {
|
|
|
- int result = 0;
|
|
|
- for(int i=0; i<a.length; i++) { result += a[i]; }
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Traktuje tablicę o rozmiarze N jako wektor N-wymiarowy, i wylicza jego
|
|
|
- * długość przy użyciu klasycznego wzoru dla geometrii euklidesowej.
|
|
|
- * @param a
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double width(double[] a) {
|
|
|
- return Math.sqrt( sum( mul(a,a) ) );
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Traktuje tablicę o rozmiarze N jako wektor N-wymiarowy, i wylicza jego
|
|
|
- * długość przy użyciu klasycznego wzoru dla geometrii euklidesowej.
|
|
|
- * @param a
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static double width(int[] a) {
|
|
|
- return Math.sqrt( sum( mul(a,a) ) );
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Traktuje tablice liczb jako wektory i wylicza podobieństwo między nimi.
|
|
|
- * Składowe wyniku zawierają dwie wartości. {@code ratio} określa stosunek
|
|
|
- * proporcjonalności długościami wektorów. {@code value} należy do
|
|
|
- * zakresu {@code [0;1]} i określa podobieństwo pomiędzy kierunkiem
|
|
|
- * reprezentowanym przez wektory. Metoda użyteczna przy sprawdzaniu
|
|
|
- * szeroko rozumianej korelacji między dwoma ciągami liczb.
|
|
|
- * <p>
|
|
|
- * {@code value = 0 } (przeciwne) jeśli wszystkie elementy spełniają warunek:
|
|
|
- * <code>a<sub>i</sub> = -b<sub>i</sub></code>
|
|
|
- * <br/>
|
|
|
- * {@code value = 1 } (identyczne) jeśli wszystkie elementy spełniają warunek:
|
|
|
- * <code>a<sub>i</sub> = ratio ⋅ b<sub>i</sub></code>
|
|
|
- * <br/>
|
|
|
- * {@code value = NaN } jeśli wszystkie elementy spełniają warunek:
|
|
|
- * <code>a<sub>i</sub> = 0</code> lub <code>b<sub>i</sub> = 0</code>
|
|
|
- * <br/>
|
|
|
- * {@code value = NaN } oraz {@code ratio = NaN } jeśli wszystkie elementy spełniają warunek:
|
|
|
- * <code>a<sub>i</sub> = 0</code> oraz <code>b<sub>i</sub> = 0</code>
|
|
|
- * <br/>
|
|
|
- * </p>
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static VMRel rel(double[] a, double[] b) {
|
|
|
- double wa = width(a);
|
|
|
- double wb = width(b);
|
|
|
- double[] na = div(a, wa);
|
|
|
- double[] nb = div(b, wb);
|
|
|
- double value = (2.0 - width(sub(na, nb))) / 2;
|
|
|
- double ratio = wa / wb;
|
|
|
- return new VMRel(value, ratio);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Traktuje tablice liczb jako wektory i wylicza podobieństwo między nimi.
|
|
|
- * Składowe wyniku zawierają dwie wartości. {@code ratio} określa stosunek
|
|
|
- * proporcjonalności długościami wektorów. {@code value} należy do
|
|
|
- * zakresu {@code [0;1]} i określa podobieństwo pomiędzy kierunkiem
|
|
|
- * reprezentowanym przez wektory. Metoda użyteczna przy sprawdzaniu
|
|
|
- * szeroko rozumianej korelacji między dwoma ciągami liczb.
|
|
|
- * <p>
|
|
|
- * {@code value = 0 } (przeciwne) jeśli wszystkie elementy spełniają warunek:
|
|
|
- * <code>a<sub>i</sub> = -b<sub>i</sub></code>
|
|
|
- * <br/>
|
|
|
- * {@code value = 1 } (identyczne) jeśli wszystkie elementy spełniają warunek:
|
|
|
- * <code>a<sub>i</sub> = ratio ⋅ b<sub>i</sub></code>
|
|
|
- * <br/>
|
|
|
- * {@code value = NaN } jeśli wszystkie elementy spełniają warunek:
|
|
|
- * <code>a<sub>i</sub> = 0</code> lub <code>b<sub>i</sub> = 0</code>
|
|
|
- * <br/>
|
|
|
- * {@code value = NaN } oraz {@code ratio = NaN } jeśli wszystkie elementy spełniają warunek:
|
|
|
- * <code>a<sub>i</sub> = 0</code> oraz <code>b<sub>i</sub> = 0</code>
|
|
|
- * <br/>
|
|
|
- * </p>
|
|
|
- * @param a
|
|
|
- * @param b
|
|
|
- * @return
|
|
|
- */
|
|
|
- public static VMRel rel(int[] a, int[] b) {
|
|
|
- double wa = width(a);
|
|
|
- double wb = width(b);
|
|
|
- double[] na = div(a, wa);
|
|
|
- double[] nb = div(b, wb);
|
|
|
- double value = (2.0 - width(sub(na, nb))) / 2;
|
|
|
- double ratio = wa / wb;
|
|
|
- return new VMRel(value, ratio);
|
|
|
- }
|
|
|
-
|
|
|
-/* ************************************************************************** */
|
|
|
-
|
|
|
- /**
|
|
|
- * Wynik działania funkcji {@link MathVectors#rel}
|
|
|
- */
|
|
|
- public static final class VMRel implements Comparable<VMRel> {
|
|
|
- private final double value;
|
|
|
- private final double ratio;
|
|
|
-
|
|
|
- /**
|
|
|
- * Tworzy nowy obiekt przechowujący parę liczb określających wynik.
|
|
|
- * @param value
|
|
|
- * @param ratio
|
|
|
- */
|
|
|
- public VMRel(double value, double ratio) {
|
|
|
- this.value = value;
|
|
|
- this.ratio = ratio;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Szeroko rozumiany "współczynnik proporcjonalności" między porównywanymi
|
|
|
- * wartościami. Liczba rzeczywista z zakresu <code>[0; +∞)</code> lub
|
|
|
- * {@code NaN}
|
|
|
- * @see MathVectors#rel
|
|
|
- * @return
|
|
|
- */
|
|
|
- public double ratio() {
|
|
|
- return ratio;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Szeroko rozumiany "współczynnik korelacji" między porównywanymi
|
|
|
- * wartościami. Liczba rzeczywista z zakresu <code>[0; 1]</code> lub
|
|
|
- * {@code NaN}
|
|
|
- * @see MathVectors#rel
|
|
|
- * @return
|
|
|
- */
|
|
|
- public double value() {
|
|
|
- return value;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int compareTo(VMRel object) {
|
|
|
- int dv = (int)Math.round(100 * (value - object.value));
|
|
|
- if( dv != 0) {
|
|
|
- return dv;
|
|
|
- } else {
|
|
|
- return (int)Math.round(100 * (ratio - object.ratio));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int hashCode() {
|
|
|
- return HashHelper.hashValues(7, 37, value, ratio);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean equals(Object value) {
|
|
|
- return (value instanceof VMRel) && compareTo((VMRel)value) == 0;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public String toString() {
|
|
|
- return String.format(Locale.ROOT, "%.2fr%.2f", value, ratio);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
-}
|
|
|
-
|