Singular value decomposition: Difference between revisions

m
m (→‎{{header|Wren}}: Minor tidy)
 
(4 intermediate revisions by 3 users not shown)
Line 179:
|-0.7071067812 0.7071067812 |
 
</pre>
 
===Alternative using Eigen===
{{libheader|Eigen}}
<syntaxhighlight lang="C++">
#include <Eigen/Dense>
#include <cstdlib>
#include <iomanip>
#include <iostream>
 
int main() {
using namespace Eigen;
int rows, columns;
if (!(std::cin >> rows >> columns))
return EXIT_FAILURE;
MatrixXd matrix(rows, columns);
for (int row = 0; row < rows; ++row) {
for (int column = 0; column < columns; ++column) {
if (!(std::cin >> matrix(row, column)))
return EXIT_FAILURE;
}
}
auto svd = matrix.bdcSvd().compute(matrix, ComputeFullU | ComputeFullV);
std::cout << std::setprecision(15) << std::fixed << svd.matrixU() << "\n\n"
<< svd.singularValues() << "\n\n"
<< svd.matrixV() << '\n';
return EXIT_SUCCESS;
}
</syntaxhighlight>
 
{{out}}
<pre>
0.316227766016838 0.948683298050514
0.948683298050514 -0.316227766016838
 
6.708203932499368
2.236067977499789
 
0.707106781186547 0.707106781186548
0.707106781186548 -0.707106781186547
</pre>
 
Line 414 ⟶ 454:
[[-0.70710678 -0.70710678]
[-0.70710678 0.70710678]]
</pre>
 
=={{header|Raku}}==
<syntaxhighlight lang="raku" line># 20230108 Raku programming solution
 
use Math::Libgsl::Matrix;
use Math::Libgsl::LinearAlgebra;
 
my @M = <3 0>, <4 5>;
my Math::Libgsl::Matrix \M .= new: @M.elems, @M.first.elems;
(^M.size1)>>.&{ M.set-row: $_, @M[$_;*] }
 
my (\V,\S) = SV-decomp M;
 
say "U factor: " and say (^M.size1)>>.&{ M.get-row($_)>>.fmt: '%.10g' }
say "singular values: " and say (^S.size )>>.&{ S.get($_)>>.fmt: '%.10g' }
say "Vt factor: " and say (^V.size1)>>.&{ V.get-row($_)>>.fmt: '%.10g' }</syntaxhighlight>
{{out}}
<pre>U factor:
([-0.316227766 -0.9486832981] [-0.9486832981 0.316227766])
singular values:
((6.708203932) (2.236067977))
Vt factor:
([-0.7071067812 -0.7071067812] [-0.7071067812 0.7071067812])</pre>
 
=={{header|RPL}}==
Singular values decomposition has a built-in instruction in RPL versions running on HP-48G and newer models.
[[ 3 0 ][ 4 5 ]] SVD
{{out}}
<pre>
3: [[-0.316227766017 -0.948683298051][-0.948683298051 0.316227766017]]
2: [[-0.707106781187 -0.707106781187][-0.707106781187 -0.707106781187]]
1: [6.70820393245 2.2360679775]
</pre>
 
Line 1,088 ⟶ 1,161:
-0.70710678118655 0.70710678118655
</pre>
 
=={{header|Raku}}==
<syntaxhighlight lang="raku" line># 20230108 Raku programming solution
 
use Math::Libgsl::Matrix;
use Math::Libgsl::LinearAlgebra;
 
my @M = <3 0>, <4 5>;
my Math::Libgsl::Matrix \M .= new: @M.elems, @M.first.elems;
(^M.size1)>>.&{ M.set-row: $_, @M[$_;*] }
 
my (\V,\S) = SV-decomp M;
 
say "U factor: " and say (^M.size1)>>.&{ M.get-row($_)>>.fmt: '%.10g' }
say "singular values: " and say (^S.size )>>.&{ S.get($_)>>.fmt: '%.10g' }
say "Vt factor: " and say (^V.size1)>>.&{ V.get-row($_)>>.fmt: '%.10g' }</syntaxhighlight>
{{out}}
<pre>U factor:
([-0.316227766 -0.9486832981] [-0.9486832981 0.316227766])
singular values:
((6.708203932) (2.236067977))
Vt factor:
([-0.7071067812 -0.7071067812] [-0.7071067812 0.7071067812])</pre>
 
=={{header|Wren}}==
Line 1,117 ⟶ 1,167:
{{libheader|Wren-fmt}}
An embedded solution so we can use GSL to perform SVD on any m x n matrix though the example here is for a 2 x 2 matrix.
<syntaxhighlight lang="ecmascriptwren">/* svd_emdeddedSingular_value_decomposition.wren */
 
import "./fmt" for Fmt
Line 1,153 ⟶ 1,203:
 
We now embed this Wren script in the following C program, compile and run it.
<syntaxhighlight lang="c">/* gcc svd_embeddedSingular_value_decomposition.c -o svd_embeddedSingular_value_decomposition -lgsl -lgslcblas -lwren -lm */
 
#include <stdio.h>
Line 1,266 ⟶ 1,316:
WrenVM* vm = wrenNewVM(&config);
const char* module = "main";
const char* fileName = "svd_embeddedSingular_value_decomposition.wren";
char *script = readFile(fileName);
WrenInterpretResult result = wrenInterpret(vm, module, script);
9,476

edits