/*
* 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 SingularValueDecompositorTest extends AbstractDecompositorTest {
@Override
public LinearAlgebra.DecompositorFactory decompositorFactory() {
return LinearAlgebra.SVD;
}
@Test
public void testDecompose_1x1() {
double[][] input = new double[][]{
{89.0}
};
double[][][] output = new double[][][]{
{
{1.0}
},
{
{89.0}
},
{
{1.0}
}
};
performTest(input, output);
}
@Test
public void testDecompose_2x2() {
double[][] input = new double[][]{
{7.0, 19.0},
{-1.0, 100.0}
};
double[][][] output = new double[][][]{
{
{0.187, -0.982},
{0.982, 0.187}
},
{
{101.790, 0.0},
{0.0, 7.064}
},
{
{0.003, -1.0},
{1.0, 0.003}
}
};
performTest(input, output);
}
@Test
public void testDecompose_3x3() {
double[][] input = new double[][]{
{2.0, 0.0, 0.0},
{0.0, 4.0, 0.0},
{0.0, 0.0, 8.0}
};
double[][][] output = new double[][][]{
{
{0.0, 0.0, -1.0},
{0.0, -1.0, 0.0},
{1.0, 0.0, 0.0}
},
{
{8.0, 0.0, 0.0},
{0.0, 4.0, 0.0},
{0.0, 0.0, 2.0}
},
{
{0.0, 0.0, -1.0},
{0.0, -1.0, 0.0},
{1.0, 0.0, 0.0}
}
};
performTest(input, output);
}
@Test
public void testDecompose_3x1() {
double[][] input = new double[][]{
{6.0},
{19.0},
{20.0}
};
double[][][] output = new double[][][]{
{
{-0.213},
{-0.673},
{-0.708}
},
{
{28.231}
},
{
{-1.0}
}
};
performTest(input, output);
}
@Test
public void testDecompose_4x4() {
double[][] input = new double[][]{
{9.0, 18.0, -1.0, 43.0},
{-9.0, 14.0, 85.0, -2.0},
{1.0, 100.0, 53.0, -22.0},
{28.0, 15.0, -28.0, 5.0}
};
double[][][] output = new double[][][]{
{
{-0.041, -0.261, 0.928, -0.262},
{-0.538, 0.664, 0.285, 0.434},
{-0.838, -0.467, -0.219, -0.179},
{0.087, -0.522, 0.095, 0.843}
},
{
{130.97, 0.0, 0.0, 0.0},
{0.0, 72.357, 0.0, 0.0},
{0.0, 0.0, 46.283, 0.0},
{0.0, 0.0, 0.0, 18.496}
},
{
{0.046, -0.323, 0.178, 0.928},
{-0.693, -0.691, 0.005, -0.207},
{-0.706, 0.643, 0.196, 0.222},
{0.139, -0.067, 0.964, -0.215}
}
};
performTest(input, output);
}
@Test
public void testDecompose_5x5() {
double[][] input = new double[][]{
{-1.0, 8.0, 17.0, 100.0, 10.0},
{4.0, -5.0, 44.0, 11.0, -66.0},
{22.0, 54.0, 24.0, -14.0, 1.0},
{99.0, 25.0, 77.0, -23.0, 4.0},
{11.0, 7.0, -15.0, -4.0, 81.0}
};
double[][][] output = new double[][][]{
{
{-0.072, 0.35, 0.927, 0.039, -0.105},
{0.252, 0.624, -0.132, -0.058, 0.725},
{0.337, -0.113, 0.036, 0.932, 0.06},
{0.901, -0.158, 0.124, -0.338, -0.182},
{-0.072, -0.671, 0.326, -0.110, 0.653}
},
{
{141.208, 0.0, 0.0, 0.0, 0.0},
{0.0, 112.592, 0.0, 0.0, 0.0},
{0.0, 0.0, 101.124, 0.0, 0.0},
{0.0, 0.0, 0.0, 44.635, 0.0},
{0.0, 0.0, 0.0, 0.0, 10.868}
},
{
{0.686, -0.207, 0.15, -0.324, -0.599},
{0.272, -0.134, 0.152, 0.934, -0.109},
{0.626, 0.254, 0.153, -0.087, 0.716},
{-0.210, 0.442, 0.856, -0.034, -0.161},
{-0.136, -0.824, 0.444, -0.115, 0.303}
}
};
performTest(input, output);
}
}