Browse Source

Docs: convert remaining docs to CommonMark

cuda
Christoph Ruegg 12 years ago
parent
commit
80684ea443
  1. 1
      MathNet.Numerics.All.sln
  2. 3
      MathNet.Numerics.Data.sln
  3. 5
      MathNet.Numerics.Net35Only.sln
  4. 3
      MathNet.Numerics.Portable.sln
  5. 2
      MathNet.Numerics.Portable.sln.DotSettings
  6. 39
      MathNet.Numerics.sln
  7. 8
      docs/content/CSV.md
  8. 226
      docs/content/DescriptiveStatistics.md
  9. 7
      docs/content/Distance.md
  10. 8
      docs/content/Euclid.md
  11. 8
      docs/content/Functions.md
  12. 101
      docs/content/Generate.md
  13. 12
      docs/content/IFsharpNotebook.md
  14. 16
      docs/content/IntegralTransforms.md
  15. 17
      docs/content/Integration.md
  16. 17
      docs/content/Interpolation.md
  17. 43
      docs/content/LinearEquations.md
  18. 8
      docs/content/MatlabFiles.md
  19. 8
      docs/content/MatrixMarket.md
  20. 172
      docs/content/Probability.md
  21. 95
      docs/content/Random.md
  22. 26
      docs/content/Regression.md

1
MathNet.Numerics.All.sln

@ -8,7 +8,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Readme", "Readme", "{C2F374
CONTRIBUTING.md = CONTRIBUTING.md CONTRIBUTING.md = CONTRIBUTING.md
CONTRIBUTORS.md = CONTRIBUTORS.md CONTRIBUTORS.md = CONTRIBUTORS.md
LICENSE.md = LICENSE.md LICENSE.md = LICENSE.md
MAINTAINING.md = MAINTAINING.md
README.md = README.md README.md = README.md
RELEASENOTES-Native.md = RELEASENOTES-Native.md RELEASENOTES-Native.md = RELEASENOTES-Native.md
RELEASENOTES.md = RELEASENOTES.md RELEASENOTES.md = RELEASENOTES.md

3
MathNet.Numerics.Data.sln

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013 # Visual Studio 2013
VisualStudioVersion = 12.0.30723.0 VisualStudioVersion = 12.0.31101.0
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Matlab", "src\Data\Matlab\Matlab.csproj", "{550FB330-C86F-4C9D-9B4C-6D830CEB7520}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Matlab", "src\Data\Matlab\Matlab.csproj", "{550FB330-C86F-4C9D-9B4C-6D830CEB7520}"
EndProject EndProject
@ -14,7 +14,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Readme", "Readme", "{F510F0
CONTRIBUTING.md = CONTRIBUTING.md CONTRIBUTING.md = CONTRIBUTING.md
CONTRIBUTORS.md = CONTRIBUTORS.md CONTRIBUTORS.md = CONTRIBUTORS.md
LICENSE.md = LICENSE.md LICENSE.md = LICENSE.md
MAINTAINING.md = MAINTAINING.md
README.md = README.md README.md = README.md
RELEASENOTES-Data.md = RELEASENOTES-Data.md RELEASENOTES-Data.md = RELEASENOTES-Data.md
RELEASENOTES.md = RELEASENOTES.md RELEASENOTES.md = RELEASENOTES.md

5
MathNet.Numerics.Net35Only.sln

@ -1,14 +1,11 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013 # Visual Studio 2012
VisualStudioVersion = 12.0.30723.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Readme", "Readme", "{C2F37492-38AE-4186-8A7F-17B0B080942C}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Readme", "Readme", "{C2F37492-38AE-4186-8A7F-17B0B080942C}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
CONTRIBUTING.md = CONTRIBUTING.md CONTRIBUTING.md = CONTRIBUTING.md
CONTRIBUTORS.md = CONTRIBUTORS.md CONTRIBUTORS.md = CONTRIBUTORS.md
LICENSE.md = LICENSE.md LICENSE.md = LICENSE.md
MAINTAINING.md = MAINTAINING.md
README.md = README.md README.md = README.md
RELEASENOTES.md = RELEASENOTES.md RELEASENOTES.md = RELEASENOTES.md
EndProjectSection EndProjectSection

3
MathNet.Numerics.Portable.sln

@ -1,14 +1,13 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013 # Visual Studio 2013
VisualStudioVersion = 12.0.30723.0 VisualStudioVersion = 12.0.31101.0
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Readme", "Readme", "{C2F37492-38AE-4186-8A7F-17B0B080942C}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Readme", "Readme", "{C2F37492-38AE-4186-8A7F-17B0B080942C}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
CONTRIBUTING.md = CONTRIBUTING.md CONTRIBUTING.md = CONTRIBUTING.md
CONTRIBUTORS.md = CONTRIBUTORS.md CONTRIBUTORS.md = CONTRIBUTORS.md
LICENSE.md = LICENSE.md LICENSE.md = LICENSE.md
MAINTAINING.md = MAINTAINING.md
README.md = README.md README.md = README.md
RELEASENOTES-Native.md = RELEASENOTES-Native.md RELEASENOTES-Native.md = RELEASENOTES-Native.md
RELEASENOTES.md = RELEASENOTES.md RELEASENOTES.md = RELEASENOTES.md

2
MathNet.Numerics.Portable.sln.DotSettings

@ -66,6 +66,8 @@ OTHER DEALINGS IN THE SOFTWARE.
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SVD/@EntryIndexedValue">SVD</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SVD/@EntryIndexedValue">SVD</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TFQMR/@EntryIndexedValue">TFQMR</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TFQMR/@EntryIndexedValue">TFQMR</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WH/@EntryIndexedValue">WH</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WH/@EntryIndexedValue">WH</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EAddAccessorOwnerDeclarationBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue">True</s:Boolean>
<s:String x:Key="/Default/FilterSettingsManager/AttributeFilterXml/@EntryValue">&lt;data /&gt;</s:String> <s:String x:Key="/Default/FilterSettingsManager/AttributeFilterXml/@EntryValue">&lt;data /&gt;</s:String>
<s:String x:Key="/Default/FilterSettingsManager/CoverageFilterXml/@EntryValue">&lt;data&gt;&lt;IncludeFilters /&gt;&lt;ExcludeFilters /&gt;&lt;/data&gt;</s:String></wpf:ResourceDictionary> <s:String x:Key="/Default/FilterSettingsManager/CoverageFilterXml/@EntryValue">&lt;data&gt;&lt;IncludeFilters /&gt;&lt;ExcludeFilters /&gt;&lt;/data&gt;</s:String></wpf:ResourceDictionary>

39
MathNet.Numerics.sln

@ -8,7 +8,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Readme", "Readme", "{C2F374
CONTRIBUTING.md = CONTRIBUTING.md CONTRIBUTING.md = CONTRIBUTING.md
CONTRIBUTORS.md = CONTRIBUTORS.md CONTRIBUTORS.md = CONTRIBUTORS.md
LICENSE.md = LICENSE.md LICENSE.md = LICENSE.md
MAINTAINING.md = MAINTAINING.md
README.md = README.md README.md = README.md
RELEASENOTES-Data.md = RELEASENOTES-Data.md RELEASENOTES-Data.md = RELEASENOTES-Data.md
RELEASENOTES-MKL.md = RELEASENOTES-MKL.md RELEASENOTES-MKL.md = RELEASENOTES-MKL.md
@ -37,28 +36,28 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{039229DA-A
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
docs\content\Build.md = docs\content\Build.md docs\content\Build.md = docs\content\Build.md
docs\content\Compatibility.md = docs\content\Compatibility.md docs\content\Compatibility.md = docs\content\Compatibility.md
docs\content\CSV.fsx = docs\content\CSV.fsx docs\content\CSV.md = docs\content\CSV.md
docs\content\DescriptiveStatistics.fsx = docs\content\DescriptiveStatistics.fsx docs\content\DescriptiveStatistics.md = docs\content\DescriptiveStatistics.md
docs\content\Distance.fsx = docs\content\Distance.fsx docs\content\Distance.md = docs\content\Distance.md
docs\content\Euclid.fsx = docs\content\Euclid.fsx docs\content\Euclid.md = docs\content\Euclid.md
docs\content\Functions.fsx = docs\content\Functions.fsx docs\content\Functions.md = docs\content\Functions.md
docs\content\Generate.fsx = docs\content\Generate.fsx docs\content\Generate.md = docs\content\Generate.md
docs\content\IFsharpNotebook.fsx = docs\content\IFsharpNotebook.fsx docs\content\IFsharpNotebook.md = docs\content\IFsharpNotebook.md
docs\content\index.fsx = docs\content\index.fsx docs\content\index.md = docs\content\index.md
docs\content\IntegralTransforms.fsx = docs\content\IntegralTransforms.fsx docs\content\IntegralTransforms.md = docs\content\IntegralTransforms.md
docs\content\Integration.fsx = docs\content\Integration.fsx docs\content\Integration.md = docs\content\Integration.md
docs\content\Interpolation.fsx = docs\content\Interpolation.fsx docs\content\Interpolation.md = docs\content\Interpolation.md
docs\content\LinearEquations.fsx = docs\content\LinearEquations.fsx docs\content\LinearEquations.md = docs\content\LinearEquations.md
docs\content\MatlabFiles.fsx = docs\content\MatlabFiles.fsx docs\content\MatlabFiles.md = docs\content\MatlabFiles.md
docs\content\Matrix.fsx = docs\content\Matrix.fsx docs\content\Matrix.md = docs\content\Matrix.md
docs\content\MatrixMarket.fsx = docs\content\MatrixMarket.fsx docs\content\MatrixMarket.md = docs\content\MatrixMarket.md
docs\content\MKL.md = docs\content\MKL.md docs\content\MKL.md = docs\content\MKL.md
docs\content\Packages.md = docs\content\Packages.md docs\content\Packages.md = docs\content\Packages.md
docs\content\Probability.fsx = docs\content\Probability.fsx docs\content\Probability.md = docs\content\Probability.md
docs\content\Random.fsx = docs\content\Random.fsx docs\content\Random.md = docs\content\Random.md
docs\content\Regression.fsx = docs\content\Regression.fsx docs\content\Regression.md = docs\content\Regression.md
docs\tools\templates\template.cshtml = docs\tools\templates\template.cshtml docs\tools\templates\template.cshtml = docs\tools\templates\template.cshtml
docs\content\Users.fsx = docs\content\Users.fsx docs\content\Users.md = docs\content\Users.md
EndProjectSection EndProjectSection
EndProject EndProject
Global Global

8
docs/content/CSV.fsx → docs/content/CSV.md

@ -1,9 +1,3 @@
(*** hide ***)
#I "../../out/lib/net40"
#r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll"
(**
Delimited Text Files (CSV & TSV) Delimited Text Files (CSV & TSV)
================================ ================================
@ -96,5 +90,3 @@ Among others:
* [NIST MatrixMarket text files](MatrixMarket.html) * [NIST MatrixMarket text files](MatrixMarket.html)
* [MATLAB Level-5 Mat files](MatlabFiles.html) * [MATLAB Level-5 Mat files](MatlabFiles.html)
*)

226
docs/content/DescriptiveStatistics.fsx → docs/content/DescriptiveStatistics.md

@ -1,11 +1,11 @@
(*** hide ***) [hide]
#I "../../out/lib/net40" #I "../../out/lib/net40"
#r "MathNet.Numerics.dll" #r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll" #r "MathNet.Numerics.FSharp.dll"
open MathNet.Numerics open System.Numerics
open MathNet.Numerics.Statistics open MathNet.Numerics
open MathNet.Numerics.Statistics
(**
Descriptive Statistics Descriptive Statistics
====================== ======================
@ -84,18 +84,17 @@ The mean is affected by outliers, so if you need a more robust estimate consider
$$$ $$$
\overline{x} = \frac{1}{N}\sum_{i=1}^N x_i \overline{x} = \frac{1}{N}\sum_{i=1}^N x_i
*)
let whiteNoise = Generate.Gaussian(1000, mean=10.0, standardDeviation=2.0) [lang=fsharp]
// [fsi:val samples : float [] = [|12.90021939; 9.631515037; 7.810008046; 14.13301053; ...|] ] let whiteNoise = Generate.Normal(1000, mean=10.0, standardDeviation=2.0)
Statistics.Mean whiteNoise // [fsi:val samples : float [] = [|12.90021939; 9.631515037; 7.810008046; 14.13301053; ...|] ]
// [fsi:val it : float = 10.02162347] Statistics.Mean whiteNoise
// [fsi:val it : float = 10.02162347]
let wave = Generate.Sinusoidal(1000, samplingRate=100., frequency=5., amplitude=0.5) let wave = Generate.Sinusoidal(1000, samplingRate=100., frequency=5., amplitude=0.5)
Statistics.Mean wave Statistics.Mean wave
// [fsi:val it : float = -4.133520783e-17] // [fsi:val it : float = -4.133520783e-17]
(**
Variance and Standard Deviation Variance and Standard Deviation
------------------------------- -------------------------------
@ -119,17 +118,16 @@ Bessel's correction with an $N-1$ normalizer to a sample set of size $N$.
$$$ $$$
s^2 = \frac{1}{N-1}\sum_{i=1}^N (x_i - \overline{x})^2 s^2 = \frac{1}{N-1}\sum_{i=1}^N (x_i - \overline{x})^2
*)
Statistics.Variance whiteNoise [lang=fsharp]
// [fsi:val it : float = 3.819436094] Statistics.Variance whiteNoise
Statistics.StandardDeviation whiteNoise // [fsi:val it : float = 3.819436094]
// [fsi:val it : float = 1.954337764] Statistics.StandardDeviation whiteNoise
// [fsi:val it : float = 1.954337764]
Statistics.Variance wave Statistics.Variance wave
// [fsi:val it : float = 0.1251251251] // [fsi:val it : float = 0.1251251251]
(**
#### Combined Routines #### Combined Routines
Since mean and variance are often needed together, there are routines Since mean and variance are often needed together, there are routines
@ -138,12 +136,11 @@ that evaluate both in a single pass:
`Statistics.MeanVariance(samples)` `Statistics.MeanVariance(samples)`
`ArrayStatistics.MeanVariance(samples)` `ArrayStatistics.MeanVariance(samples)`
`StreamingStatistics.MeanVariance(samples)` `StreamingStatistics.MeanVariance(samples)`
*)
Statistics.MeanVariance whiteNoise [lang=fsharp]
// [fsi:val it : float * float = (10.02162347, 3.819436094)] Statistics.MeanVariance whiteNoise
// [fsi:val it : float * float = (10.02162347, 3.819436094)]
(**
Covariance Covariance
---------- ----------
@ -160,14 +157,13 @@ q = \frac{1}{N-1}\sum_{i=1}^N (x_i - \overline{x})(y_i - \overline{y})
$$$ $$$
q = \frac{1}{N}\sum_{i=1}^N (x_i - \mu_x)(y_i - \mu_y) q = \frac{1}{N}\sum_{i=1}^N (x_i - \mu_x)(y_i - \mu_y)
*)
Statistics.Covariance(whiteNoise, whiteNoise) [lang=fsharp]
// [fsi:val it : float = 3.819436094] Statistics.Covariance(whiteNoise, whiteNoise)
Statistics.Covariance(whiteNoise, wave) // [fsi:val it : float = 3.819436094]
// [fsi:val it : float = 0.04397985084] Statistics.Covariance(whiteNoise, wave)
// [fsi:val it : float = 0.04397985084]
(**
Order Statistics Order Statistics
---------------- ----------------
@ -198,22 +194,21 @@ provided data and then on each invocation uses efficient sorted algorithms:
Such Inplace and Func variants are a common pattern throughout the Statistics class Such Inplace and Func variants are a common pattern throughout the Statistics class
and also the rest of the library. and also the rest of the library.
*)
[lang=fsharp]
Statistics.OrderStatistic(whiteNoise, 1) Statistics.OrderStatistic(whiteNoise, 1)
// [fsi:val it : float = 3.633070184] // [fsi:val it : float = 3.633070184]
Statistics.OrderStatistic(whiteNoise, 1000) Statistics.OrderStatistic(whiteNoise, 1000)
// [fsi:val it : float = 16.65183566] // [fsi:val it : float = 16.65183566]
let os = Statistics.orderStatisticFunc whiteNoise let os = Statistics.orderStatisticFunc whiteNoise
os 250 os 250
// [fsi:val it : float = 8.645491746] // [fsi:val it : float = 8.645491746]
os 500 os 500
// [fsi:val it : float = 10.11872428] // [fsi:val it : float = 10.11872428]
os 750 os 750
// [fsi:val it : float = 11.33170746] // [fsi:val it : float = 11.33170746]
(**
#### Median #### Median
Median is a robust indicator of central tendency and much less affected by outliers Median is a robust indicator of central tendency and much less affected by outliers
@ -228,14 +223,13 @@ The median is only unique if the sample size is odd. This implementation interna
uses the default quantile definition, which is equivalent to mode 8 in R and is approximately uses the default quantile definition, which is equivalent to mode 8 in R and is approximately
median-unbiased regardless of the sample distribution. If you need another convention, use median-unbiased regardless of the sample distribution. If you need another convention, use
`QuantileCustom` instead, see below for details. `QuantileCustom` instead, see below for details.
*)
Statistics.Median whiteNoise [lang=fsharp]
// [fsi:val it : float = 10.11872428] Statistics.Median whiteNoise
Statistics.Median wave // [fsi:val it : float = 10.11872428]
// [fsi:val it : float = -2.452600839e-16] Statistics.Median wave
// [fsi:val it : float = -2.452600839e-16]
(**
#### Quartiles and the 5-number summary #### Quartiles and the 5-number summary
Quartiles group the ascendingly sorted data into four equal groups, where each Quartiles group the ascendingly sorted data into four equal groups, where each
@ -250,14 +244,13 @@ estimates the median as discussed above.
`SortedArrayStatistics.UpperQuartile(data)` `SortedArrayStatistics.UpperQuartile(data)`
`ArrayStatistics.LowerQuartileInplace(data)` `ArrayStatistics.LowerQuartileInplace(data)`
`ArrayStatistics.UpperQuartileInplace(data)` `ArrayStatistics.UpperQuartileInplace(data)`
*)
Statistics.LowerQuartile whiteNoise [lang=fsharp]
// [fsi:val it : float = 8.645491746] Statistics.LowerQuartile whiteNoise
Statistics.UpperQuartile whiteNoise // [fsi:val it : float = 8.645491746]
// [fsi:val it : float = 11.33213732] Statistics.UpperQuartile whiteNoise
// [fsi:val it : float = 11.33213732]
(**
Using that data we can provide a useful set of indicators usually named 5-number summary, Using that data we can provide a useful set of indicators usually named 5-number summary,
which consists of the minimum value, the lower quartile, the median, the upper quartile and which consists of the minimum value, the lower quartile, the median, the upper quartile and
the maximum value. All these values can be visualized in the popular box plot diagrams. the maximum value. All these values can be visualized in the popular box plot diagrams.
@ -265,14 +258,13 @@ the maximum value. All these values can be visualized in the popular box plot di
`Statistics.FiveNumberSummary(data)` `Statistics.FiveNumberSummary(data)`
`SortedArrayStatistics.FiveNumberSummary(data)` `SortedArrayStatistics.FiveNumberSummary(data)`
`ArrayStatistics.FiveNumberSummaryInplace(data)` `ArrayStatistics.FiveNumberSummaryInplace(data)`
*)
Statistics.FiveNumberSummary whiteNoise [lang=fsharp]
// [fsi:val it : float [] = [|3.633070184; 8.645937823; 10.12165054; 11.33213732; 16.65183566|] ] Statistics.FiveNumberSummary whiteNoise
Statistics.FiveNumberSummary wave // [fsi:val it : float [] = [|3.633070184; 8.645937823; 10.12165054; 11.33213732; 16.65183566|] ]
// [fsi:val it : float [] = [|-0.5; -0.3584185509; -2.452600839e-16; 0.3584185509; 0.5|] ] Statistics.FiveNumberSummary wave
// [fsi:val it : float [] = [|-0.5; -0.3584185509; -2.452600839e-16; 0.3584185509; 0.5|] ]
(**
The difference between the upper and the lower quartile is called inter-quartile range (IQR) The difference between the upper and the lower quartile is called inter-quartile range (IQR)
and is a robust indicator of spread. In box plots the IQR is the total height of the box. and is a robust indicator of spread. In box plots the IQR is the total height of the box.
@ -281,12 +273,11 @@ and is a robust indicator of spread. In box plots the IQR is the total height of
`ArrayStatistics.InterquartileRangeInplace(data)` `ArrayStatistics.InterquartileRangeInplace(data)`
Just like median, quartiles use the default R8 quantile definition internally. Just like median, quartiles use the default R8 quantile definition internally.
*)
Statistics.InterquartileRange whiteNoise [lang=fsharp]
// [fsi:val it : float = 2.686199498] Statistics.InterquartileRange whiteNoise
// [fsi:val it : float = 2.686199498]
(**
#### Percentiles #### Percentiles
Percentiles extend the concept further by grouping the sorted values into 100 Percentiles extend the concept further by grouping the sorted values into 100
@ -300,14 +291,13 @@ The 0-percentile represents the minimum value, 25 the first quartile, 50 the med
`ArrayStatistics.PercentileInplace(data, p)` `ArrayStatistics.PercentileInplace(data, p)`
Just like median, percentiles use the default R8 quantile definition internally. Just like median, percentiles use the default R8 quantile definition internally.
*)
Statistics.Percentile(whiteNoise, 5) [lang=fsharp]
// [fsi:val it : float = 6.693373507] Statistics.Percentile(whiteNoise, 5)
Statistics.Percentile(whiteNoise, 98) // [fsi:val it : float = 6.693373507]
// [fsi:val it : float = 13.97580653] Statistics.Percentile(whiteNoise, 98)
// [fsi:val it : float = 13.97580653]
(**
#### Quantiles #### Quantiles
Instead of grouping into 4 or 100 boxes, quantiles generalize the concept to an infinite number Instead of grouping into 4 or 100 boxes, quantiles generalize the concept to an infinite number
@ -319,12 +309,11 @@ the inverse cumulative distribution function of the sample distribution.
`Statistics.QuantileFunc(data)` `Statistics.QuantileFunc(data)`
`SortedArrayStatistics.Quantile(data, tau)` `SortedArrayStatistics.Quantile(data, tau)`
`ArrayStatistics.QuantileInplace(data, tau)` `ArrayStatistics.QuantileInplace(data, tau)`
*)
Statistics.Quantile(whiteNoise, 0.98) [lang=fsharp]
// [fsi:val it : float = 13.97580653] Statistics.Quantile(whiteNoise, 0.98)
// [fsi:val it : float = 13.97580653]
(**
#### Quantile Conventions and Compatibility #### Quantile Conventions and Compatibility
Remember that all these descriptive statistics do not *compute* but merely *estimate* Remember that all these descriptive statistics do not *compute* but merely *estimate*
@ -354,14 +343,13 @@ The `QuantileDefinition` enumeration has the following options:
* **R7**, Excel, Mode, S * **R7**, Excel, Mode, S
* **R8**, Median, Default * **R8**, Median, Default
* **R9**, Normal * **R9**, Normal
*)
Statistics.QuantileCustom(whiteNoise, 0.98, QuantileDefinition.R3) [lang=fsharp]
// [fsi:val it : float = 13.97113209] Statistics.QuantileCustom(whiteNoise, 0.98, QuantileDefinition.R3)
Statistics.QuantileCustom(whiteNoise, 0.98, QuantileDefinition.Excel) // [fsi:val it : float = 13.97113209]
// [fsi:val it : float = 13.97127374] Statistics.QuantileCustom(whiteNoise, 0.98, QuantileDefinition.Excel)
// [fsi:val it : float = 13.97127374]
(**
Rank Statistics Rank Statistics
--------------- ---------------
@ -381,16 +369,15 @@ Similar to `QuantileDefinition`, the `RankDefinition` enumeration controls how t
`Statistics.Ranks(data, definition)` `Statistics.Ranks(data, definition)`
`SortedArrayStatistics.Ranks(data, definition)` `SortedArrayStatistics.Ranks(data, definition)`
`ArrayStatistics.RanksInplace(data, definition)` `ArrayStatistics.RanksInplace(data, definition)`
*)
Statistics.Ranks(whiteNoise) [lang=fsharp]
// [fsi:val it : float [] = [|634.0; 736.0; 405.0; 395.0; 197.0; 167.0; 722.0; 44.0; ...|] ] Statistics.Ranks(whiteNoise)
Statistics.Ranks([| 13.0; 14.0; 11.0; 12.0; 13.0 |], RankDefinition.Average) // [fsi:val it : float [] = [|634.0; 736.0; 405.0; 395.0; 197.0; 167.0; 722.0; 44.0; ...|] ]
// [fsi:val it : float [] = [|3.5; 5.0; 1.0; 2.0; 3.5|] ] Statistics.Ranks([| 13.0; 14.0; 11.0; 12.0; 13.0 |], RankDefinition.Average)
Statistics.Ranks([| 13.0; 14.0; 11.0; 12.0; 13.0 |], RankDefinition.Sports) // [fsi:val it : float [] = [|3.5; 5.0; 1.0; 2.0; 3.5|] ]
// [fsi:val it : float [] = [|3.0; 5.0; 1.0; 2.0; 3.0|] ] Statistics.Ranks([| 13.0; 14.0; 11.0; 12.0; 13.0 |], RankDefinition.Sports)
// [fsi:val it : float [] = [|3.0; 5.0; 1.0; 2.0; 3.0|] ]
(**
#### Quantile Rank #### Quantile Rank
Counterpart of the `Quantile` function, estimates $\tau$ of the provided $\tau$-quantile value Counterpart of the `Quantile` function, estimates $\tau$ of the provided $\tau$-quantile value
@ -400,14 +387,13 @@ function crosses $\tau$.
`Statistics.QuantileRank(data, x, definition)` `Statistics.QuantileRank(data, x, definition)`
`Statistics.QuantileRankFunc(data, definition)` `Statistics.QuantileRankFunc(data, definition)`
`SortedArrayStatistics.QuantileRank(data, x, definition)` `SortedArrayStatistics.QuantileRank(data, x, definition)`
*)
Statistics.QuantileRank(whiteNoise, 13.0) [lang=fsharp]
// [fsi:val it : float = 0.9370045563] Statistics.QuantileRank(whiteNoise, 13.0)
Statistics.QuantileRank(whiteNoise, 6.7, RankDefinition.Average) // [fsi:val it : float = 0.9370045563]
// [fsi:val it : float = 0.04960610389] Statistics.QuantileRank(whiteNoise, 6.7, RankDefinition.Average)
// [fsi:val it : float = 0.04960610389]
(**
Empirical Distribution Functions Empirical Distribution Functions
-------------------------------- --------------------------------
@ -416,23 +402,22 @@ Empirical Distribution Functions
`Statistics.EmpiricalInvCDF(data, tau)` `Statistics.EmpiricalInvCDF(data, tau)`
`Statistics.EmpiricalInvCDFFunc(data)` `Statistics.EmpiricalInvCDFFunc(data)`
`SortedArrayStatistics.EmpiricalCDF(data, x)` `SortedArrayStatistics.EmpiricalCDF(data, x)`
*)
[lang=fsharp]
let ecdf = Statistics.EmpiricalCDFFunc whiteNoise let ecdf = Statistics.EmpiricalCDFFunc whiteNoise
Generate.LinearSpacedMap(20, start=3.0, stop=17.0, map=ecdf) Generate.LinearSpacedMap(20, start=3.0, stop=17.0, map=ecdf)
// [fsi:val it : float [] =] // [fsi:val it : float [] =]
// [fsi: [|0.0; 0.001; 0.002; 0.005; 0.022; 0.05; 0.094; 0.172; 0.278; 0.423; 0.555; ] // [fsi: [|0.0; 0.001; 0.002; 0.005; 0.022; 0.05; 0.094; 0.172; 0.278; 0.423; 0.555; ]
// [fsi: 0.705; 0.843; 0.921; 0.944; 0.983; 0.992; 0.997; 0.999; 1.0|] ] // [fsi: 0.705; 0.843; 0.921; 0.944; 0.983; 0.992; 0.997; 0.999; 1.0|] ]
let eicdf = Statistics.empiricalInvCDFFunc whiteNoise let eicdf = Statistics.empiricalInvCDFFunc whiteNoise
[ for tau in 0.0..0.05..1.0 -> eicdf tau ] [ for tau in 0.0..0.05..1.0 -> eicdf tau ]
// [fsi:val it : float [] =] // [fsi:val it : float [] =]
// [fsi: [3.633070184; 6.682142043; 7.520000817; 8.040513497; 8.347587493; ] // [fsi: [3.633070184; 6.682142043; 7.520000817; 8.040513497; 8.347587493; ]
// [fsi: 8.645491746; 9.02681611; 9.298987151; 9.522627142; 9.819352699; 10.11872428; ] // [fsi: 8.645491746; 9.02681611; 9.298987151; 9.522627142; 9.819352699; 10.11872428; ]
// [fsi: 10.35991046; 10.57530906; 10.8259542; 11.08605473; 11.33170746; 11.54356436; ] // [fsi: 10.35991046; 10.57530906; 10.8259542; 11.08605473; 11.33170746; 11.54356436; ]
// [fsi: 11.90973541; 12.4294346; 13.36889423; 16.65183566] ] // [fsi: 11.90973541; 12.4294346; 13.36889423; 16.65183566] ]
(**
Histograms Histograms
---------- ----------
@ -459,4 +444,3 @@ Code Sample: Computing the correlation coefficient of 1000 samples of f(x) = 2x
double[] dataF = Generate.LinearSpacedMap(1000, 0, 100, x => 2*x); double[] dataF = Generate.LinearSpacedMap(1000, 0, 100, x => 2*x);
double[] dataG = Generate.LinearSpacedMap(1000, 0, 100, x => x*x); double[] dataG = Generate.LinearSpacedMap(1000, 0, 100, x => x*x);
double correlation = Correlation.Pearson(dataF, dataG); double correlation = Correlation.Pearson(dataF, dataG);
*)

7
docs/content/Distance.fsx → docs/content/Distance.md

@ -1,9 +1,3 @@
(*** hide ***)
#I "../../out/lib/net40"
#r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll"
(**
Distance Metrics Distance Metrics
================ ================
@ -195,4 +189,3 @@ It is a fundamental distance measure in information theory but less relevant in
[lang=csharp] [lang=csharp]
double d = Distance.Hamming(x, y); double d = Distance.Hamming(x, y);
*)

8
docs/content/Euclid.fsx → docs/content/Euclid.md

@ -1,9 +1,3 @@
(*** hide ***)
#I "../../out/lib/net40"
#r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll"
(**
Euclid & Number Theory Euclid & Number Theory
====================== ======================
@ -105,5 +99,3 @@ Closely related to the GCD, `LeastCommonMultiple` returns the **LCM** of two or
[lang=csharp] [lang=csharp]
Euclid.LeastCommonMultiple(3, 5, 6); // 30 Euclid.LeastCommonMultiple(3, 5, 6); // 30
*)

8
docs/content/Functions.fsx → docs/content/Functions.md

@ -1,9 +1,3 @@
(*** hide ***)
#I "../../out/lib/net40"
#r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll"
(**
Special Functions Special Functions
================= =================
@ -381,5 +375,3 @@ for both real and complex arguments.
* **Hyperbolic Area**: Asinh, Acosh, Atanh, Acoth, Asech, Acsch * **Hyperbolic Area**: Asinh, Acosh, Atanh, Acoth, Asech, Acsch
* **Sinc**: Normalized sinc function $x \mapsto \frac{\sin\pi x}{\pi x}$ * **Sinc**: Normalized sinc function $x \mapsto \frac{\sin\pi x}{\pi x}$
* Conversion routines between radian, degree and grad. * Conversion routines between radian, degree and grad.
*)

101
docs/content/Generate.fsx → docs/content/Generate.md

@ -1,12 +1,12 @@
(*** hide ***) [hide]
#I "../../out/lib/net40" #I "../../out/lib/net40"
#r "MathNet.Numerics.dll" #r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll" #r "MathNet.Numerics.FSharp.dll"
open System open System.Numerics
open MathNet.Numerics open MathNet.Numerics
let a = [| 2.0; 4.0; 3.0; 6.0 |] open MathNet.Numerics.Statistics
let a = [| 2.0; 4.0; 3.0; 6.0 |]
(**
Generating Data Generating Data
=============== ===============
@ -28,14 +28,13 @@ and either a provided step or a step of 1.0. Linear range is equivalent to the
single colon `:` and double colon `::` operators in MATLAB. single colon `:` and double colon `::` operators in MATLAB.
F# has built in linear range support in array comprehensions with the colon operator: F# has built in linear range support in array comprehensions with the colon operator:
*)
[ 10.0 .. 2.0 .. 15.0 ] [lang=fsharp]
// [fsi:val it : float list = [10.0; 12.0; 14.0] ] [ 10.0 .. 2.0 .. 15.0 ]
[ for x in 10.0 .. 2.0 .. 15.0 -> sin x ] // [fsi:val it : float list = [10.0; 12.0; 14.0] ]
// [fsi:val it : float list = [-0.5440211109; -0.536572918; 0.9906073557] ] [ for x in 10.0 .. 2.0 .. 15.0 -> sin x ]
// [fsi:val it : float list = [-0.5440211109; -0.536572918; 0.9906073557] ]
(**
In C# you can get the same result with `LinearRange`: In C# you can get the same result with `LinearRange`:
[lang=csharp] [lang=csharp]
@ -61,15 +60,14 @@ This is equivalent to the linspace and logspace operators in MATLAB.
Generate.LinearSpacedMap(15, 0.0, Math.Pi, Math.Sin); // applies sin(x) to each value Generate.LinearSpacedMap(15, 0.0, Math.Pi, Math.Sin); // applies sin(x) to each value
In F# you can also use: In F# you can also use:
*)
Generate.linearSpacedMap 15 0.0 Math.PI sin [lang=fsharp]
// [fsi:val it : float [] = ] Generate.linearSpacedMap 15 0.0 Math.PI sin
// [fsi: [|0.0; 0.222520934; 0.4338837391; 0.6234898019; 0.7818314825; 0.9009688679; ] // [fsi:val it : float [] = ]
// [fsi: 0.9749279122; 1.0; 0.9749279122; 0.9009688679; 0.7818314825; 0.6234898019; ] // [fsi: [|0.0; 0.222520934; 0.4338837391; 0.6234898019; 0.7818314825; 0.9009688679; ]
// [fsi: 0.4338837391; 0.222520934; 1.224606354e-16|] ] // [fsi: 0.9749279122; 1.0; 0.9749279122; 0.9009688679; 0.7818314825; 0.6234898019; ]
// [fsi: 0.4338837391; 0.222520934; 1.224606354e-16|] ]
(**
`LogSpaced` works the same way but instead of the values $10^x$ it spaces the decade exponents $x$ linearly `LogSpaced` works the same way but instead of the values $10^x$ it spaces the decade exponents $x$ linearly
between the provided two exponents. between the provided two exponents.
@ -94,15 +92,15 @@ $$$
s[n] = A\cdot\delta[n-d] = \begin{cases} 0 &\mbox{if } n \ne d \\ A & \mbox{if } n = d\end{cases} s[n] = A\cdot\delta[n-d] = \begin{cases} 0 &\mbox{if } n \ne d \\ A & \mbox{if } n = d\end{cases}
There is also a periodic version in `PeriodicImpulse` which accepts an additional `period` parameter. There is also a periodic version in `PeriodicImpulse` which accepts an additional `period` parameter.
*)
Generate.Impulse(8, 2.0, 3) [lang=fsharp]
// [fsi:val it : float [] = [|0.0; 0.0; 0.0; 2.0; 0.0; 0.0; 0.0; 0.0|] ] Generate.Impulse(8, 2.0, 3)
// [fsi:val it : float [] = [|0.0; 0.0; 0.0; 2.0; 0.0; 0.0; 0.0; 0.0|] ]
Generate.PeriodicImpulse(8, 3, 10.0, 1)
// [fsi:val it : float [] = [|0.0; 10.0; 0.0; 0.0; 10.0; 0.0; 0.0; 10.0|] ]
Generate.PeriodicImpulse(8, 3, 10.0, 1)
// [fsi:val it : float [] = [|0.0; 10.0; 0.0; 0.0; 10.0; 0.0; 0.0; 10.0|] ]
(**
Heaviside Step Heaviside Step
-------------- --------------
@ -118,13 +116,12 @@ The `Step` routines generates a Heaviside step, but just like the Kronecker Delt
$$$ $$$
s[n] = A\cdot H[n-d] = \begin{cases} 0 &\mbox{if } n < d \\ A & \mbox{if } n \ge d\end{cases} s[n] = A\cdot H[n-d] = \begin{cases} 0 &\mbox{if } n < d \\ A & \mbox{if } n \ge d\end{cases}
*)
Generate.Step(8, 2.0, 3) [lang=fsharp]
// [fsi:val it : float [] = [|0.0; 0.0; 0.0; 2.0; 2.0; 2.0; 2.0; 2.0|] ] Generate.Step(8, 2.0, 3)
// [fsi:val it : float [] = [|0.0; 0.0; 0.0; 2.0; 2.0; 2.0; 2.0; 2.0|] ]
(**
Periodic Sawtooth Periodic Sawtooth
----------------- -----------------
@ -154,14 +151,14 @@ normalized to strictly $0\le\alpha < A$.
* **Delay**: Optional initial delay, in samples. Contributes to $\theta$. * **Delay**: Optional initial delay, in samples. Contributes to $\theta$.
The equivalent map function accepts a custom map lambda as second argument after the length: The equivalent map function accepts a custom map lambda as second argument after the length:
*)
Generate.periodicMap 15 ((+) 100.0) 1000.0 100.0 10.0 0.0 0 [lang=fsharp]
// [fsi:val it : float [] = ] Generate.periodicMap 15 ((+) 100.0) 1000.0 100.0 10.0 0.0 0
// [fsi: [|100.0; 101.0; 102.0; 103.0; 104.0; 105.0; 106.0; 107.0; 108.0; 109.0; ] // [fsi:val it : float [] = ]
// [fsi: 100.0; 101.0; 102.0; 103.0; 104.0|] ] // [fsi: [|100.0; 101.0; 102.0; 103.0; 104.0; 105.0; 106.0; 107.0; 108.0; 109.0; ]
// [fsi: 100.0; 101.0; 102.0; 103.0; 104.0|] ]
(**
Sinusoidal Sinusoidal
---------- ----------
@ -200,8 +197,8 @@ generated using the variants with the `Sequence` suffix, e.g. `UniformMap2Sequen
Instead of uniform we can also sample from other distributions. Instead of uniform we can also sample from other distributions.
* `Gaussian` - sample an array or sequence form a normal or standard distribution * `Normal` - sample an array or sequence form a normal distribution
* `Stable` - sample from a Levy alpha-stable distribution. * `Standard` - sample an array or sequence form a standard distribution
In addition, the `Random` functions accept a custom distribution instance to sample In addition, the `Random` functions accept a custom distribution instance to sample
from. See the section about random numbers and probability distributions for details. from. See the section about random numbers and probability distributions for details.
@ -218,12 +215,11 @@ the the corresponding value in the input data.
Generate.Map(a, x => x + 1.0); // returns array { 3.0, 5.0, 4.0, 7.0 } Generate.Map(a, x => x + 1.0); // returns array { 3.0, 5.0, 4.0, 7.0 }
In F# you'd typically use the Array module to the same effect (and should continue to do so): In F# you'd typically use the Array module to the same effect (and should continue to do so):
*)
Array.map ((+) 1.0) a [lang=fsharp]
// [fsi:val it : float [] = [|3.0; 5.0; 4.0; 7.0|] ] Array.map ((+) 1.0) a
// [fsi:val it : float [] = [|3.0; 5.0; 4.0; 7.0|] ]
(**
...but no equivalent operation is available in the .NET base class libraries (BCL) for C#. ...but no equivalent operation is available in the .NET base class libraries (BCL) for C#.
You can use LINQ, but that operates on sequences instead of arrays: You can use LINQ, but that operates on sequences instead of arrays:
@ -231,22 +227,19 @@ You can use LINQ, but that operates on sequences instead of arrays:
a.Select(x => x + 1.0).ToArray(); a.Select(x => x + 1.0).ToArray();
Similarly, with `Map2` you can also map a function accepting two inputs to two input arrays: Similarly, with `Map2` you can also map a function accepting two inputs to two input arrays:
*)
let b = [| 1.0; -1.0; 2.0; -2.0 |] [lang=fsharp]
Generate.Map2(a, b, fun x y -> x + y) let b = [| 1.0; -1.0; 2.0; -2.0 |]
// [fsi:val it : float [] = [|3.0; 3.0; 5.0; 4.0|] ] Generate.Map2(a, b, fun x y -> x + y)
// [fsi:val it : float [] = [|3.0; 3.0; 5.0; 4.0|] ]
(**
Typical F# equivalent: Typical F# equivalent:
*)
Array.map2 (+) a b [lang=fsharp]
// [fsi:val it : float [] = [|3.0; 3.0; 5.0; 4.0|] ] Array.map2 (+) a b
// [fsi:val it : float [] = [|3.0; 3.0; 5.0; 4.0|] ]
(**
And in C# with LINQ: And in C# with LINQ:
[lang=csharp] [lang=csharp]
a.Zip(b, (x, y) => x + y).ToArray(); a.Zip(b, (x, y) => x + y).ToArray();
*)

12
docs/content/IFsharpNotebook.fsx → docs/content/IFsharpNotebook.md

@ -1,4 +1,11 @@
(**  [hide]
#I "../../out/lib/net40"
#r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll"
open System.Numerics
open MathNet.Numerics
open MathNet.Numerics.LinearAlgebra
IF# Notebook IF# Notebook
============ ============
@ -36,6 +43,7 @@ Unfortunately loading this script requires the exact version in the path - if yo
Alternatively you can also use the code below and adapt it to your needs, e.g. if you want it to show more rows. Alternatively you can also use the code below and adapt it to your needs, e.g. if you want it to show more rows.
[lang=fsharp]
open MathNet.Numerics.LinearAlgebra open MathNet.Numerics.LinearAlgebra
let inline (|Float|_|) (v:obj) = let inline (|Float|_|) (v:obj) =
@ -82,5 +90,3 @@ Alternatively you can also use the code below and adapt it to your needs, e.g. i
{ ContentType = "text/latex"; Data = formatVector x }) { ContentType = "text/latex"; Data = formatVector x })
App.AddDisplayPrinter (fun (x:Vector<float32>) -> App.AddDisplayPrinter (fun (x:Vector<float32>) ->
{ ContentType = "text/latex"; Data = formatVector x }) { ContentType = "text/latex"; Data = formatVector x })
*)

16
docs/content/IntegralTransforms.fsx → docs/content/IntegralTransforms.md

@ -1,9 +1,11 @@
(*** hide ***) [hide]
#I "../../out/lib/net40" #I "../../out/lib/net40"
#r "MathNet.Numerics.dll" #r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll" #r "MathNet.Numerics.FSharp.dll"
open System.Numerics
open MathNet.Numerics
open MathNet.Numerics.IntegralTransforms
(**
Fourier and related linear integral transforms Fourier and related linear integral transforms
============================================== ==============================================
@ -16,6 +18,7 @@ The transforms implement a separate forward and inverse transform method.
How the forward and inverse methods are related to each other and what exact definition How the forward and inverse methods are related to each other and what exact definition
is to be used can be specified by an additional _options_ parameter. is to be used can be specified by an additional _options_ parameter.
Fourier Space: Discrete Fourier Transform and FFT Fourier Space: Discrete Fourier Transform and FFT
------------------------------------------------- -------------------------------------------------
@ -61,9 +64,8 @@ Useful symmetries of the Fourier transform:
* h(t) is imaginary-valued even <=> H(f) is imaginary-valued even * h(t) is imaginary-valued even <=> H(f) is imaginary-valued even
* h(t) is imaginary-valued odd <=> H(f) is real-valued odd * h(t) is imaginary-valued odd <=> H(f) is real-valued odd
Hartley Space: Discrete Hartley Transform Hartley Space: Discrete Hartley Transform
----------------------------------------- -----------------------------------------
... ...
*)

17
docs/content/Integration.fsx → docs/content/Integration.md

@ -1,19 +1,22 @@
(*** hide ***) [hide]
#I "../../out/lib/net40" #I "../../out/lib/net40"
#r "MathNet.Numerics.dll" #r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll" #r "MathNet.Numerics.FSharp.dll"
open System.Numerics
open MathNet.Numerics
open MathNet.Numerics.Integration
(**
Numerical Integration Numerical Integration
===================== =====================
Simpson's Rule Simpson's Rule
-------------- --------------
Newton Cotes Trapezium Rule Newton Cotes Trapezium Rule
--------------------------- ---------------------------
Double-Exponential Transformation Double-Exponential Transformation
--------------------------------- ---------------------------------
*)

17
docs/content/Interpolation.fsx → docs/content/Interpolation.md

@ -1,9 +1,11 @@
(*** hide ***) [hide]
#I "../../out/lib/net40" #I "../../out/lib/net40"
#r "MathNet.Numerics.dll" #r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll" #r "MathNet.Numerics.FSharp.dll"
open System.Numerics
open MathNet.Numerics
open MathNet.Numerics.Interpolation
(**
Interpolation Interpolation
============= =============
@ -24,11 +26,13 @@ If unsure, we recommend using _RationalWithoutPoles_ for most cases.
Alternatively you can also use the algorithms directly, they're publicly available in the _Algorithms_ sub-namespace for those who want to use a specific algorithm. The following algorithms are available: Alternatively you can also use the algorithms directly, they're publicly available in the _Algorithms_ sub-namespace for those who want to use a specific algorithm. The following algorithms are available:
Interpolation on equidistant sample points Interpolation on equidistant sample points
------------------------------------------ ------------------------------------------
* *Polynomial*: Barycentric Algorithm * *Polynomial*: Barycentric Algorithm
Interpolation on arbitrary sample points Interpolation on arbitrary sample points
---------------------------------------- ----------------------------------------
@ -40,11 +44,10 @@ Interpolation on arbitrary sample points
* *Natural Cubic Spline* * *Natural Cubic Spline*
* *Akima Cubic Spline* * *Akima Cubic Spline*
Interpolation with additional data Interpolation with additional data
---------------------------------- ----------------------------------
* *Generic Barycentric Interpolation*, requires barycentric weights * *Generic Barycentric Interpolation*, requires barycentric weights
* *Generic Spline*, requires spline coefficients * *Generic Spline*, requires spline coefficients
* *Generic Cubic Hermite Spline*, requires the derivatives * *Generic Cubic Hermite Spline*, requires the derivatives
*)

43
docs/content/LinearEquations.fsx → docs/content/LinearEquations.md

@ -1,10 +1,11 @@
(*** hide ***) [hide]
#I "../../out/lib/net40" #I "../../out/lib/net40"
#r "MathNet.Numerics.dll" #r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll" #r "MathNet.Numerics.FSharp.dll"
open MathNet.Numerics.LinearAlgebra open System.Numerics
open MathNet.Numerics
open MathNet.Numerics.LinearAlgebra
(**
Linear Equation Systems Linear Equation Systems
======================= =======================
@ -72,15 +73,15 @@ Which we can solve explicitly with the LU-decomposition, or simply by using the
The resulting $\mathbf{x}$ is $[1,\;-2,\;-2]$, hence the solution $x=1,\;y=-2,\;z=-2$. The resulting $\mathbf{x}$ is $[1,\;-2,\;-2]$, hence the solution $x=1,\;y=-2,\;z=-2$.
In F# the syntax is a bit lighter: In F# the syntax is a bit lighter:
*)
let A = matrix [[ 3.0; 2.0; -1.0 ] [lang=fsharp]
[ 2.0; -2.0; 4.0 ] let A = matrix [[ 3.0; 2.0; -1.0 ]
[ -1.0; 0.5; -1.0 ]] [ 2.0; -2.0; 4.0 ]
let b = vector [ 1.0; -2.0; 0.0 ] [ -1.0; 0.5; -1.0 ]]
let x = A.Solve(b) // 1;-2;-2 let b = vector [ 1.0; -2.0; 0.0 ]
let x = A.Solve(b) // 1;-2;-2
(**
Normalizing Equation Systems Normalizing Equation Systems
---------------------------- ----------------------------
@ -121,11 +122,11 @@ $$$
\begin{bmatrix}0\\0\\20\\0\end{bmatrix} \begin{bmatrix}0\\0\\20\\0\end{bmatrix}
Which is in standard from, so we can solve normally: Which is in standard from, so we can solve normally:
*)
[lang=fsharp]
let A' = matrix [[ 3.0; 4.0; -1.0; 0.0 ] let A' = matrix [[ 3.0; 4.0; -1.0; 0.0 ]
[ 4.0; 5.0; 0.0; -1.0 ] [ 4.0; 5.0; 0.0; -1.0 ]
[ 5.0; 6.0; 0.0; 0.0; ] [ 5.0; 6.0; 0.0; 0.0; ]
[ 6.0; 7.0; 0.0; 0.0 ]] [ 6.0; 7.0; 0.0; 0.0 ]]
let b' = vector [ 0.0; 0.0; 20.0; 0.0 ] let b' = vector [ 0.0; 0.0; 20.0; 0.0 ]
let x' = A'.Solve(b') // -140; 120; 60; 40 let x' = A'.Solve(b') // -140; 120; 60; 40

8
docs/content/MatlabFiles.fsx → docs/content/MatlabFiles.md

@ -1,9 +1,3 @@
(*** hide ***)
#I "../../out/lib/net40"
#r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll"
(**
MATLAB Level-5 Mat Files MATLAB Level-5 Mat Files
======================== ========================
@ -86,5 +80,3 @@ Among others:
* [Delimited Text Files (CSV & TSV)](CSV.html) * [Delimited Text Files (CSV & TSV)](CSV.html)
* [NIST MatrixMarket text files](MatrixMarket.html) * [NIST MatrixMarket text files](MatrixMarket.html)
*)

8
docs/content/MatrixMarket.fsx → docs/content/MatrixMarket.md

@ -1,9 +1,3 @@
(*** hide ***)
#I "../../out/lib/net40"
#r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll"
(**
NIST MatrixMarket Text Files NIST MatrixMarket Text Files
============================ ============================
@ -58,5 +52,3 @@ Among others:
* [Delimited Text Files (CSV & TSV)](CSV.html) * [Delimited Text Files (CSV & TSV)](CSV.html)
* [MATLAB Level-5 Mat files](MatlabFiles.html) * [MATLAB Level-5 Mat files](MatlabFiles.html)
*)

172
docs/content/Probability.fsx → docs/content/Probability.md

@ -1,11 +1,12 @@
(*** hide ***) [hide]
#I "../../out/lib/net40" #I "../../out/lib/net40"
#r "MathNet.Numerics.dll" #r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll" #r "MathNet.Numerics.FSharp.dll"
open MathNet.Numerics.Random open System.Numerics
open MathNet.Numerics.Distributions open MathNet.Numerics
open MathNet.Numerics.Random
(** open MathNet.Numerics.Distributions
Probability Distributions Probability Distributions
========================= =========================
@ -125,26 +126,24 @@ as last argument.
gamma2.RandomSource = new Mrg32k3a(); gamma2.RandomSource = new Mrg32k3a();
A few more examples, this time in F#: A few more examples, this time in F#:
*)
// some probability distributions [lang=fsharp]
let normal = Normal.WithMeanVariance(3.0, 1.5, a) // some probability distributions
let exponential = Exponential(2.4) let normal = Normal.WithMeanVariance(3.0, 1.5, a)
let gamma = Gamma(2.0, 1.5, Random.crypto()) let exponential = Exponential(2.4)
let cauchy = Cauchy(0.0, 1.0, Random.mrg32k3aWith 10 false) let gamma = Gamma(2.0, 1.5, Random.crypto())
let poisson = Poisson(3.0) let cauchy = Cauchy(0.0, 1.0, Random.mrg32k3aWith 10 false)
let geometric = Geometric(0.8, Random.system()) let poisson = Poisson(3.0)
let geometric = Geometric(0.8, Random.system())
(**
Some of the distributions also have routines for maximum-likelihood parameter Some of the distributions also have routines for maximum-likelihood parameter
estimation from a set of samples: estimation from a set of samples:
*)
let estimation = LogNormal.Estimate([| 2.0; 1.5; 2.1; 1.2; 3.0; 2.4; 1.8 |]) [lang=fsharp]
let mean, variance = estimation.Mean, estimation.Variance let estimation = LogNormal.Estimate([| 2.0; 1.5; 2.1; 1.2; 3.0; 2.4; 1.8 |])
let moreSamples = estimation.Samples() |> Seq.take 10 |> Seq.toArray let mean, variance = estimation.Mean, estimation.Variance
let moreSamples = estimation.Samples() |> Seq.take 10 |> Seq.toArray
(**
or in C#: or in C#:
[lang=csharp] [lang=csharp]
@ -162,38 +161,31 @@ to provide uniform random numbers. By default, this member is an instance of Sys
but one can easily replace this with more sophisticated random number generators from but one can easily replace this with more sophisticated random number generators from
`MathNet.Numerics.Random` (see [Random Numbers](Random.html) for details). `MathNet.Numerics.Random` (see [Random Numbers](Random.html) for details).
*) [lang=fsharp]
// sample some random numbers from these distributions
// sample some random numbers from these distributions // continuous distributions sample to floating-point numbers:
// continuous distributions sample to floating-point numbers: let continuous =
let continuous = [ yield normal.Sample()
[ yield normal.Sample() yield exponential.Sample()
yield exponential.Sample() yield! gamma.Samples() |> Seq.take 10 ]
yield! gamma.Samples() |> Seq.take 10 ]
// discrete distributions on the other hand sample to integers:
let discrete =
[ poisson.Sample()
poisson.Sample()
geometric.Sample() ]
(** // discrete distributions on the other hand sample to integers:
let discrete =
[ poisson.Sample()
poisson.Sample()
geometric.Sample() ]
Instead of creating a distribution object we can also sample directly with static functions. Instead of creating a distribution object we can also sample directly with static functions.
Note that no intermediate value caching is possible this way and parameters must be validated on each call. Note that no intermediate value caching is possible this way and parameters must be validated on each call.
*) [lang=fsharp]
// using the default number generator (SystemRandomSource.Default)
// using the default number generator (SystemRandomSource.Default) let w = Rayleigh.Sample(1.5)
let w = Rayleigh.Sample(1.5) let x = Hypergeometric.Sample(100, 20, 5)
let x = Hypergeometric.Sample(100, 20, 5)
// or by manually providing the uniform random number generator
let u = Normal.Sample(Random.system(), 2.0, 4.0)
let v = Laplace.Samples(Random.mersenneTwister(), 1.0, 3.0) |> Seq.take 100 |> List.ofSeq
// or by manually providing the uniform random number generator
(** let u = Normal.Sample(Random.system(), 2.0, 4.0)
let v = Laplace.Samples(Random.mersenneTwister(), 1.0, 3.0) |> Seq.take 100 |> List.ofSeq
If you need to sample not just one or two values but a large number of them, If you need to sample not just one or two values but a large number of them,
there are routines that either fill an existing array or return an enumerable. there are routines that either fill an existing array or return an enumerable.
@ -207,12 +199,12 @@ Let's sample 100'000 values from a laplace distribution with mean 1.0 and scale
Laplace.Samples(samples, 1.0, 2.0); Laplace.Samples(samples, 1.0, 2.0);
Let's do some random walks in F# (TODO: Graph): Let's do some random walks in F# (TODO: Graph):
*)
Seq.scan (+) 0.0 (Normal.Samples(0.0, 1.0)) |> Seq.take 10 |> Seq.toArray [lang=fsharp]
Seq.scan (+) 0.0 (Cauchy.Samples(0.0, 1.0)) |> Seq.take 10 |> Seq.toArray Seq.scan (+) 0.0 (Normal.Samples(0.0, 1.0)) |> Seq.take 10 |> Seq.toArray
Seq.scan (+) 0.0 (Cauchy.Samples(0.0, 1.0)) |> Seq.take 10 |> Seq.toArray
(**
Distribution Functions and Properties Distribution Functions and Properties
------------------------------------- -------------------------------------
@ -221,52 +213,52 @@ Once parametrized they can compute a variety of distribution properties
or evaluate distribution functions. Because it is often numerically more stable or evaluate distribution functions. Because it is often numerically more stable
and faster to compute and work with such quantities in the logarithmic domain, and faster to compute and work with such quantities in the logarithmic domain,
some of them are also available with the `Ln`-suffix. some of them are also available with the `Ln`-suffix.
*)
[lang=fsharp]
// distribution properties of the gamma we've configured above // distribution properties of the gamma we've configured above
let gammaStats = let gammaStats =
( gamma.Mean, ( gamma.Mean,
gamma.Variance, gamma.Variance,
gamma.StdDev, gamma.StdDev,
gamma.Entropy, gamma.Entropy,
gamma.Skewness, gamma.Skewness,
gamma.Mode ) gamma.Mode )
// probability distribution functions of the normal we've configured above. // probability distribution functions of the normal we've configured above.
let nd = normal.Density(4.0) (* PDF *) let nd = normal.Density(4.0) (* PDF *)
let ndLn = normal.DensityLn(4.0) (* ln(PDF) *) let ndLn = normal.DensityLn(4.0) (* ln(PDF) *)
let nc = normal.CumulativeDistribution(4.0) (* CDF *) let nc = normal.CumulativeDistribution(4.0) (* CDF *)
let nic = normal.InverseCumulativeDistribution(0.7) (* CDF^(-1) *) let nic = normal.InverseCumulativeDistribution(0.7) (* CDF^(-1) *)
// Distribution functions can also be evaluated without creating an object, // Distribution functions can also be evaluated without creating an object,
// but then you have to pass in the distribution parameters as first arguments: // but then you have to pass in the distribution parameters as first arguments:
let nd2 = Normal.PDF(3.0, sqrt 1.5, 4.0) let nd2 = Normal.PDF(3.0, sqrt 1.5, 4.0)
let ndLn2 = Normal.PDFLn(3.0, sqrt 1.5, 4.0) let ndLn2 = Normal.PDFLn(3.0, sqrt 1.5, 4.0)
let nc2 = Normal.CDF(3.0, sqrt 1.5, 4.0) let nc2 = Normal.CDF(3.0, sqrt 1.5, 4.0)
let nic2 = Normal.InvCDF(3.0, sqrt 1.5, 0.7) let nic2 = Normal.InvCDF(3.0, sqrt 1.5, 0.7)
(**
Composing Distributions Composing Distributions
----------------------- -----------------------
Specifically for F# there is also a `Sample` module that allows a somewhat more functional Specifically for F# there is also a `Sample` module that allows a somewhat more functional
view on distribution sampling functions by having the random source passed in as last argument. view on distribution sampling functions by having the random source passed in as last argument.
This way they can be composed and transformed arbitrarily if curried: This way they can be composed and transformed arbitrarily if curried:
*)
/// Transform a sample from a distribution [lang=fsharp]
let s1 rng = tanh (Sample.normal 2.0 0.5 rng) /// Transform a sample from a distribution
let s1 rng = tanh (Sample.normal 2.0 0.5 rng)
/// But we really want to transform the function, not the resulting sample: /// But we really want to transform the function, not the resulting sample:
let s1f rng = Sample.map tanh (Sample.normal 2.0 0.5) rng let s1f rng = Sample.map tanh (Sample.normal 2.0 0.5) rng
/// Exactly the same also works with functions generating full sequences /// Exactly the same also works with functions generating full sequences
let s1s rng = Sample.mapSeq tanh (Sample.normalSeq 2.0 0.5) rng let s1s rng = Sample.mapSeq tanh (Sample.normalSeq 2.0 0.5) rng
/// Now with multiple distributions, e.g. their product: /// Now with multiple distributions, e.g. their product:
let s2 rng = (Sample.normal 2.0 1.5 rng) * (Sample.cauchy 2.0 0.5 rng) let s2 rng = (Sample.normal 2.0 1.5 rng) * (Sample.cauchy 2.0 0.5 rng)
let s2f rng = Sample.map2 (*) (Sample.normal 2.0 1.5) (Sample.cauchy 2.0 0.5) rng let s2f rng = Sample.map2 (*) (Sample.normal 2.0 1.5) (Sample.cauchy 2.0 0.5) rng
let s2s rng = Sample.mapSeq2 (*) (Sample.normalSeq 2.0 1.5) (Sample.cauchySeq 2.0 0.5) rng let s2s rng = Sample.mapSeq2 (*) (Sample.normalSeq 2.0 1.5) (Sample.cauchySeq 2.0 0.5) rng
// Taking some samples from the composed function // Taking some samples from the composed function
Seq.take 10 (s2s (Random.system())) |> Seq.toArray Seq.take 10 (s2s (Random.system())) |> Seq.toArray

95
docs/content/Random.fsx → docs/content/Random.md

@ -1,11 +1,12 @@
(*** hide ***) [hide]
#I "../../out/lib/net40" #I "../../out/lib/net40"
#r "MathNet.Numerics.dll" #r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll" #r "MathNet.Numerics.FSharp.dll"
open MathNet.Numerics.Random open System.Numerics
open MathNet.Numerics.Distributions open MathNet.Numerics
open MathNet.Numerics.Random
(** open MathNet.Numerics.Distributions
Pseudo-Random Numbers Pseudo-Random Numbers
===================== =====================
@ -57,22 +58,21 @@ $X\sim\mathcal{U}(0,1)$, such that $0 \le x < 1$:
decimal sampled = rng.NextDecimal(); decimal sampled = rng.NextDecimal();
In F# we can do exactly the same, or alternatively use the `Random` module: In F# we can do exactly the same, or alternatively use the `Random` module:
*)
let samples = Random.doubles 1000 [lang=fsharp]
let samples = Random.doubles 1000
// overwrite the whole array with new random values // overwrite the whole array with new random values
Random.doubleFill samples Random.doubleFill samples
// create an infinite sequence: // create an infinite sequence:
let sampleSeq = Random.doubleSeq () let sampleSeq = Random.doubleSeq ()
// take a single random value // take a single random value
let rng = Random.shared let rng = Random.shared
let sample = rng.NextDouble() let sample = rng.NextDouble()
let sampled = rng.NextDecimal() let sampled = rng.NextDecimal()
(**
If you have used the .Net BCL random number generators before, you have likely If you have used the .Net BCL random number generators before, you have likely
noticed a few differences: we used special routines to create a full array or noticed a few differences: we used special routines to create a full array or
sequence in one go, we were able to sample a decimal number, an we used static functions sequence in one go, we were able to sample a decimal number, an we used static functions
@ -125,19 +125,19 @@ and is often unwanted. That's why all Math.NET Numerics RNGs are by default
initialized with a robust seed taken from the `CryptoRandomSource` if available, initialized with a robust seed taken from the `CryptoRandomSource` if available,
or else a combination of a random number from a shared RNG, the time and a Guid or else a combination of a random number from a shared RNG, the time and a Guid
(which are supposed to be generated uniquely, worldwide). (which are supposed to be generated uniquely, worldwide).
*)
let someTimeSeed = RandomSeed.Time() // not recommended [lang=fsharp]
let someGuidSeed = RandomSeed.Guid() let someTimeSeed = RandomSeed.Time() // not recommended
let someRobustSeed = RandomSeed.Robust() // recommended, used by default let someGuidSeed = RandomSeed.Guid()
let someRobustSeed = RandomSeed.Robust() // recommended, used by default
(** Let's generate random numbers like before, but this time with custom seed 42: *) Let's generate random numbers like before, but this time with custom seed 42:
let samplesSeeded = Random.doublesSeed 42 1000 [lang=fsharp]
Random.doubleFillSeed 42 samplesSeeded let samplesSeeded = Random.doublesSeed 42 1000
let samplesSeqSeeded = Random.doubleSeqSeed 42 Random.doubleFillSeed 42 samplesSeeded
let samplesSeqSeeded = Random.doubleSeqSeed 42
(**
Or without the F# Random module, e.g. in C#: Or without the F# Random module, e.g. in C#:
[lang=csharp] [lang=csharp]
@ -179,23 +179,23 @@ Let's sample a few uniform random values using Mersenne Twister in C#:
In F# you can use the constructor as well, or alternatively use the `Random` module. In F# you can use the constructor as well, or alternatively use the `Random` module.
In case of the latter, all objects will be cast to their common base type `System.Random`: In case of the latter, all objects will be cast to their common base type `System.Random`:
*)
// By using the normal constructor (random1 has type MersenneTwister) [lang=fsharp]
let random1 = MersenneTwister() // By using the normal constructor (random1 has type MersenneTwister)
let random1b = MersenneTwister(42) // with seed let random1 = MersenneTwister()
let random1b = MersenneTwister(42) // with seed
// By using the Random module (random2 has type System.Random) // By using the Random module (random2 has type System.Random)
let random2 = Random.mersenneTwister () let random2 = Random.mersenneTwister ()
let random2b = Random.mersenneTwisterSeed 42 // with seed let random2b = Random.mersenneTwisterSeed 42 // with seed
let random2c = Random.mersenneTwisterWith 42 false // opt-out of thread-safety let random2c = Random.mersenneTwisterWith 42 false // opt-out of thread-safety
// Using some other algorithms:
let random3 = Random.crypto ()
let random4 = Random.xorshift ()
let random5 = Random.wh2006 ()
// Using some other algorithms:
let random3 = Random.crypto ()
let random4 = Random.xorshift ()
let random5 = Random.wh2006 ()
(**
Shared Instances and Thread Safety Shared Instances and Thread Safety
---------------------------------- ----------------------------------
@ -224,15 +224,15 @@ For convenience a few generators provide a thread-safe shared instance
var b = MersenneTwister.Default; var b = MersenneTwister.Default;
Or with the F# module: Or with the F# module:
*)
let a = Random.systemShared [lang=fsharp]
let b = Random.mersenneTwisterShared let a = Random.systemShared
let b = Random.mersenneTwisterShared
// or if you don't care, simply
let c = Random.shared;
// or if you don't care, simply
let c = Random.shared;
(**
Non-Uniform Random Numbers Non-Uniform Random Numbers
-------------------------- --------------------------
@ -253,4 +253,3 @@ distributions in the `MathNet.Numerics.Distributions` namespace.
Normal.Samples(c, 0.0, 1.0); Normal.Samples(c, 0.0, 1.0);
See [Probability Distributions](Probability.html) for details. See [Probability Distributions](Probability.html) for details.
*)

26
docs/content/Regression.fsx → docs/content/Regression.md

@ -1,12 +1,12 @@
(*** hide ***) [hide]
#I "../../out/lib/net40" #I "../../out/lib/net40"
#r "MathNet.Numerics.dll" #r "MathNet.Numerics.dll"
#r "MathNet.Numerics.FSharp.dll" #r "MathNet.Numerics.FSharp.dll"
open MathNet.Numerics open System.Numerics
open MathNet.Numerics.LinearRegression open MathNet.Numerics
open MathNet.Numerics.LinearAlgebra open MathNet.Numerics.LinearRegression
open MathNet.Numerics.LinearAlgebra
(**
Curve Fitting: Linear Regression Curve Fitting: Linear Regression
================================ ================================
@ -40,11 +40,10 @@ parameters of the least squares fit:
double b = p.Item2; // == 0.5; slope double b = p.Item2; // == 0.5; slope
Or in F#: Or in F#:
*)
let a, b = Fit.Line ([|10.0;20.0;30.0|], [|15.0;20.0;25.0|]) [lang=fsharp]
let a, b = Fit.Line ([|10.0;20.0;30.0|], [|15.0;20.0;25.0|])
(**
How well do these parameters fit the data? The data points happen to be positioned How well do these parameters fit the data? The data points happen to be positioned
exactly on a line. Indeed, the [coefficient of determination](https://en.wikipedia.org/wiki/Coefficient_of_determination) exactly on a line. Indeed, the [coefficient of determination](https://en.wikipedia.org/wiki/Coefficient_of_determination)
confirms the perfect fit: confirms the perfect fit:
@ -259,7 +258,6 @@ are dependent on the point of interest $t$.
Regularization Regularization
-------------- --------------
Iterative Methods Iterative Methods
----------------- -----------------
*)
Loading…
Cancel
Save