All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.nd4j.linalg.api.complex.BaseComplexFloat Maven / Gradle / Ivy
package org.nd4j.linalg.api.complex;
import org.nd4j.linalg.factory.Nd4j;
/**
* Base complex float class
*
* @author Adam Gibson
*/
public abstract class BaseComplexFloat implements IComplexFloat {
protected float real,imag;
public BaseComplexFloat(float real, float imag) {
this.real = real;
this.imag = imag;
}
public BaseComplexFloat(float real) {
this(real,0);
}
/**
* Convert to a double
*
* @return this complex number as a double
*/
@Override
public IComplexDouble asDouble() {
return Nd4j.createDouble(realComponent(), imaginaryComponent());
}
/**
* Convert to a float
*
* @return this complex number as a float
*/
@Override
public IComplexFloat asFloat() {
return this;
}
@Override
public IComplexFloat conji() {
set(realComponent(), -imaginaryComponent());
return this;
}
@Override
public IComplexNumber conj() {
return dup().conji();
}
@Override
public IComplexNumber set(Number real, Number imag) {
this.real = real.floatValue();
this.imag = imag.floatValue();
return this;
}
@Override
public IComplexNumber copy(IComplexNumber other) {
return Nd4j.createFloat(other.realComponent().floatValue(), other.imaginaryComponent().floatValue());
}
/**
* Add two complex numbers in-place
*
* @param c
* @param result
*/
@Override
public IComplexNumber addi(IComplexNumber c, IComplexNumber result) {
if (this == result) {
set(realComponent() + c.realComponent().floatValue(),imaginaryComponent() + result.imaginaryComponent().floatValue());
} else {
result.set(result.realComponent().floatValue() + c.realComponent().floatValue(),result.imaginaryComponent().floatValue() + c.imaginaryComponent().floatValue());
}
return this;
}
/**
* Add two complex numbers in-place storing the result in this.
*
* @param c
*/
@Override
public IComplexNumber addi(IComplexNumber c) {
return addi(c,this);
}
/**
* Add two complex numbers.
*
* @param c
*/
@Override
public IComplexNumber add(IComplexNumber c) {
return dup().addi(c);
}
/**
* Add a realComponent number to a complex number in-place.
*
* @param a
* @param result
*/
@Override
public IComplexNumber addi(Number a, IComplexNumber result) {
if (this == result) {
set(realComponent()+ a.floatValue(),imaginaryComponent() + a.floatValue());
} else {
result.set(result.realComponent().floatValue() + a.floatValue(),imaginaryComponent() + a.floatValue());
}
return result;
}
/**
* Add a realComponent number to complex number in-place, storing the result in this.
*
* @param c
*/
@Override
public IComplexNumber addi(Number c) {
return addi(c,this);
}
/**
* Add a realComponent number to a complex number.
*
* @param c
*/
@Override
public IComplexNumber add(Number c) {
return dup().addi(c);
}
/**
* Subtract two complex numbers, in-place
*
* @param c
* @param result
*/
@Override
public IComplexNumber subi(IComplexNumber c, IComplexNumber result) {
if (this == result) {
set(realComponent()- c.realComponent().floatValue(),imaginaryComponent() - result.imaginaryComponent().floatValue());
} else {
return result.set(result.realComponent().floatValue() - c.realComponent().floatValue(),result.imaginaryComponent().floatValue() - c.imaginaryComponent().floatValue());
}
return this;
}
@Override
public IComplexNumber subi(IComplexNumber c) {
return subi(c,this);
}
/**
* Subtract two complex numbers
*
* @param c
*/
@Override
public IComplexNumber sub(IComplexNumber c) {
return dup().subi(c);
}
@Override
public IComplexNumber subi(Number a, IComplexNumber result) {
if (this == result) {
set(realComponent()- a.floatValue(),imaginaryComponent() - a.floatValue());
} else {
return result.set(result.realComponent().floatValue() - a.floatValue(),imaginaryComponent() - a.floatValue());
}
return result;
}
@Override
public IComplexNumber subi(Number a) {
return subi(a,this);
}
@Override
public IComplexNumber sub(Number r) {
return dup().subi(r);
}
/**
* Multiply two complex numbers, inplace
*
* @param c
* @param result
*/
@Override
public IComplexNumber muli(IComplexNumber c, IComplexNumber result) {
float newR = realComponent()* c.realComponent().floatValue() - imaginaryComponent() * c.imaginaryComponent().floatValue();
float newI = realComponent()* c.imaginaryComponent().floatValue() + imaginaryComponent() * c.realComponent().floatValue();
result.set(newR,newI);
return result;
}
@Override
public IComplexNumber muli(IComplexNumber c) {
return muli(c,this);
}
/**
* Multiply two complex numbers
*
* @param c
*/
@Override
public IComplexNumber mul(IComplexNumber c) {
return dup().muli(c);
}
@Override
public IComplexNumber mul(Number v) {
return dup().muli(v);
}
@Override
public IComplexNumber muli(Number v, IComplexNumber result) {
if (this == result) {
set(realComponent() * v.floatValue(),imaginaryComponent() * v.floatValue());
} else {
result.set(result.realComponent().floatValue() * v.floatValue(),result.imaginaryComponent().floatValue() * v.floatValue());
}
return result;
}
@Override
public IComplexNumber muli(Number v) {
return muli(v,this);
}
/**
* Divide two complex numbers
*
* @param c
*/
@Override
public IComplexNumber div(IComplexNumber c) {
return dup().divi(c);
}
/**
* Divide two complex numbers, in-place
*
* @param c
* @param result
*/
@Override
public IComplexNumber divi(IComplexNumber c, IComplexNumber result) {
float d = c.realComponent().floatValue() * c.realComponent().floatValue() + c.imaginaryComponent().floatValue() * c.imaginaryComponent().floatValue();
float newR = (realComponent()* c.realComponent().floatValue() + imaginaryComponent() * c.imaginaryComponent().floatValue()) / d;
float newI = (imaginaryComponent() * c.realComponent().floatValue() - realComponent()* c.imaginaryComponent().floatValue()) / d;
result.set(newR,newI);
return result;
}
@Override
public IComplexNumber divi(IComplexNumber c) {
return divi(c,this);
}
@Override
public IComplexNumber divi(Number v, IComplexNumber result) {
if (this == result) {
set(realComponent()/ v.floatValue(),imaginaryComponent() / v.floatValue());
} else {
result.set(result.realComponent().floatValue() / v.floatValue(),imaginaryComponent() / v.floatValue());
}
return result;
}
@Override
public IComplexNumber divi(Number v) {
return divi(v,this);
}
@Override
public IComplexNumber div(Number v) {
return dup().divi(v);
}
@Override
public boolean eq(IComplexNumber c) {
return false;
}
@Override
public boolean ne(IComplexNumber c) {
return false;
}
@Override
public Float realComponent() {
return real;
}
@Override
public Float imaginaryComponent() {
return imag;
}
@Override
public IComplexFloat divi(float v) {
this.real = real / v;
this.imag = imag / v;
return this;
}
@Override
public IComplexNumber div(float v) {
return dup().divi(v);
}
/**
* Return the absolute value
*/
@Override
public Float absoluteValue() {
return (float) Math.sqrt(real * real + imag * imag);
}
/**
* Returns the argument of a complex number.
*/
@Override
public Float complexArgument() {
return (float) Math.acos(realComponent()/ absoluteValue());
}
@Override
public IComplexFloat invi() {
float d = realComponent() * realComponent() + imaginaryComponent() * imaginaryComponent();
set(realComponent() / d,-imaginaryComponent() / d);
return this;
}
@Override
public IComplexNumber inv() {
return dup().invi();
}
@Override
public IComplexNumber neg() {
return dup().negi();
}
@Override
public IComplexFloat negi() {
set(-realComponent(),-imaginaryComponent());
return this;
}
@Override
public IComplexFloat sqrt() {
float a = absoluteValue();
float s2 = (float)Math.sqrt(2);
float p = (float)Math.sqrt(a + realComponent())/s2;
float q = (float)Math.sqrt(a - realComponent())/s2 * Math.signum(imaginaryComponent());
return Nd4j.createFloat(p, q);
}
/**
* Comparing two floatComplex values.
*
* @param o
*/
@Override
public boolean equals(Object o) {
return super.equals(o);
}
public boolean isZero() {
return real == 0;
}
@Override
public boolean isReal() {
return imaginaryComponent() == 0;
}
@Override
public boolean isImag() {
return realComponent() == 0;
}
@Override
public int hashCode() {
int result = (real != +0.0f ? Float.floatToIntBits(real) : 0);
result = 31 * result + (imag != +0.0f ? Float.floatToIntBits(imag) : 0);
return result;
}
@Override
public String toString() {
if (imag >= 0) {
return real + " + " + imag + "i";
} else {
return real + " - " + (-imag) + "i";
}
}
}