gov.nist.math.jampack.Norm Maven / Gradle / Ivy
package gov.nist.math.jampack;
/**
* Norm computes norms of matrices.
*
* Comments: At this point only the Frobenius norm is calculated. Later the 1,
* 2, and infinity norms will be added.
*
* @version Pre-alpha
* @author G. W. Stewart
*/
public final class Norm {
/**
* Computes the Frobenius norm of a the submatrix (ii1:ii2, jj1,jj2) of a
* Zmat.
*
* @param A
* The zmat
* @param ii1
* The lower row index
* @param ii2
* The upper row index
* @param jj1
* The lower column index
* @param jj2
* The upper column index
* @return The Frobenius norm of A(ii1:ii2, jj1:jj2)
*/
public static double fro(Zmat A, int ii1, int ii2, int jj1, int jj2) {
int i, i1, i2, j, j1, j2;
double fac, nrm, scale;
i1 = ii1 - 1;
i2 = ii2 - 1;
j1 = jj1 - 1;
j2 = jj2 - 1;
scale = 0.0;
for (i = i1; i <= i2; i++) {
for (j = j1; j <= j2; j++) {
scale = Math.max(scale, Math.abs(A.re[i][j]) + Math.abs(A.im[i][j]));
}
}
if (scale == 0.0) {
return 0.0;
}
if (scale < 1.0) {
scale = scale * 1.0e20;
}
scale = 1.0 / scale;
nrm = 0.0;
for (i = i1; i <= i2; i++) {
for (j = j1; j <= j2; j++) {
fac = scale * A.re[i][j];
nrm = nrm + fac * fac;
fac = scale * A.im[i][j];
nrm = nrm + fac * fac;
}
}
return Math.sqrt(nrm) / scale;
}
/**
* Computes the Frobenius norm of a Zmat.
*
* @param A
* The Zmat
* @return The Frobenius norm of A
*/
public static double fro(Zmat A) {
return Norm.fro(A, 1, A.rx, 1, A.cx);
}
/**
* Computes the Frobenius norm of a Z1.
*
* @param u
* The Z1
* @return The Frobenius norm of u
*/
public static double fro(Z1 u) {
int i;
double fac, nrm, scale;
int n = u.n;
scale = 0.0;
for (i = 0; i < n; i++) {
scale = Math.max(scale, Math.abs(u.re[i]) + Math.abs(u.im[i]));
}
if (scale == 0.0) {
return 0.0;
}
if (scale < 1.0) {
scale = scale * 1.0e20;
}
scale = 1.0 / scale;
nrm = 0.0;
for (i = 0; i < n; i++) {
fac = scale * u.re[i];
nrm = nrm + fac * fac;
fac = scale * u.im[i];
nrm = nrm + fac * fac;
}
return Math.sqrt(nrm) / scale;
}
/**
* Computes the Frobenius norm of a Zdiagmat.
*
* @param D
* The Zdiagmat
* @return The Frobenius norm of D
*/
public static double fro(Zdiagmat D) {
int i;
double fac, nrm, scale;
int n = D.order;
scale = 0.0;
for (i = 0; i < n; i++) {
scale = Math.max(scale, Math.abs(D.re[i]) + Math.abs(D.im[i]));
}
if (scale == 0.0) {
return 0.0;
}
if (scale < 1.0) {
scale = scale * 1.0e20;
}
scale = 1.0 / scale;
nrm = 0.0;
for (i = 0; i < n; i++) {
fac = scale * D.re[i];
nrm = nrm + fac * fac;
fac = scale * D.im[i];
nrm = nrm + fac * fac;
}
return Math.sqrt(nrm) / scale;
}
}