/*
* Copyright 2011-2013, by Vladimir Kostyukov and Contributors.
*
* This file is part of la4j project (http://la4j.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributor(s): -
*
*/
package org.la4j.decomposition;
import org.junit.Test;
import org.la4j.LinearAlgebra;
public class QRDecompositorTest extends AbstractDecompositorTest {
@Override
public LinearAlgebra.DecompositorFactory decompositorFactory() {
return LinearAlgebra.QR;
}
@Test
public void testDecompose_1x1() {
double[][] input = new double[][]{
{15.0}
};
double[][][] output = new double[][][]{
{
{-1.0}
},
{
{-15.0}
}
};
performTest(input, output);
}
@Test
public void testDecompose_2x2() {
double[][] input = new double[][]{
{5.0, 10.0},
{70.0, 11.0}
};
double[][][] output = new double[][][]{
{
{-0.071, 0.997},
{-0.997, -0.071}
},
{
{-70.178, -11.685},
{0.0, 9.191}
}
};
performTest(input, output);
}
@Test
public void testDecompose_4x1() {
double[][] input = new double[][]{
{8.0},
{2.0},
{-10.0},
{54.0}
};
double[][][] output = new double[][][]{
{
{-0.144},
{-0.036},
{0.180},
{-0.972}
},
{
{-55.534}
}
};
performTest(input, output);
}
@Test
public void testDecompose_3x2() {
double[][] input = new double[][]{
{65.0, 4.0},
{9.0, 12.0},
{32.0, 42.0}
};
double[][][] output = new double[][][]{
{
{-0.890, 0.455},
{-0.123, -0.246},
{-0.438, -0.856}
},
{
{-73.007, -23.450},
{0.000, -37.069}
}
};
performTest(input, output);
}
@Test
public void testDecompose_3x3() {
double[][] input = new double[][]{
{-8.0, 0.0, 0.0},
{0.0, -4.0, -6.0},
{0.0, 0.0, -2.0}
};
double[][][] output = new double[][][]{
{
{-1.0, 0.0, 0.0},
{0.0, -1.0, 0.0},
{0.0, 0.0, -1.0}
},
{
{8.0, 0.0, 0.0},
{0.0, 4.0, 6.0},
{0.0, 0.0, 2.0}
}
};
performTest(input, output);
}
@Test
public void testDecompose_3x3_2() {
double[][] input = new double[][]{
{-2.0, 6.0, 14.0},
{-10.0, -9.0, 6.0},
{12.0, 16.0, 100.0}
};
double[][][] output = new double[][][]{
{
{-0.127, 0.920, 0.371},
{-0.635, 0.212, -0.743},
{0.762, 0.330, -0.557}
},
{
{15.748, 17.145, 70.612},
{0.0, 8.891, 47.167},
{0.0, 0.0, -54.966}
}
};
performTest(input, output);
}
@Test
public void testDecompose_4x3() {
double[][] input = new double[][]{
{51.0, 4.0, 19.0},
{7.0, 17.0, 77.0},
{5.0, 6.0, 7.0},
{100.0, 1.0, -10.0}
};
double[][][] output = new double[][][]{
{
{-0.453, -0.121, 0.364},
{-0.062, -0.928, 0.236},
{-0.044, -0.323, -0.887},
{-0.888, 0.143, -0.158}
},
{
{-112.583, -4.024, -4.823},
{0.0, -18.050, -77.428},
{0.0, 0.0, 20.509}
}
};
performTest(input, output);
}
@Test
public void testDecompose_5x5() {
double[][] input = new double[][]{
{14.0, 66.0, 11.0, 4.0, 61.0},
{10.0, 22.0, 54.0, -1.0, 1.0},
{-19.0, 26.0, 4.0, 44.0, 14.0},
{87.0, -1.0, 34.0, 29.0, -2.0},
{18.0, 43.0, 51.0, 39.0, 16.0}
};
double[][][] output = new double[][][]{
{
{-0.151, -0.754, -0.520, 0.358, 0.097},
{-0.108, -0.242, 0.739, 0.388, 0.483},
{0.205, -0.342, -0.001, -0.771, 0.496},
{-0.941, 0.173, -0.088, -0.211, 0.180},
{-0.195, -0.475, 0.419, -0.287, -0.692}
},
{
{-92.466, -14.459, -48.602, -26.334, -7.700},
{0.0, -84.599, -41.067, -31.363, -58.992},
{0.0, 0.0, 52.549, 10.907, -24.128},
{0.0, 0.0, 0.0, -50.189, 7.268},
{0.0, 0.0, 0.0, 0.0, 1.908}
}
};
performTest(input, output);
}
}