标签: mathnet-numerics

并行.不使用所有核心

我正在使用Math.Net Numerics平行内部进行繁重的数学计算Parallel.For块.

当我在本地系统中运行4核(2*2)的代码时,它使用全部4个核心.

但是,当我在具有8个内核(4*2)的开发服务器中运行相同的代码时,它只使用4个内核.

我试过设置MaxDegreeOfParallism,但无法帮助.

知道为什么没有使用所有核心.

以下是示例代码.

Parallel.For(0,10000,(i)=>
{

 // heavy math computations using matrices
});
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library mathnet-numerics parallel.for math.net

9
推荐指数
1
解决办法
2729
查看次数

使用带有C#的Math.Net数字交叉产品

我有两个向量MathNet.Numerics.LinearAlgebra.Generic.Vector<double>,如下所示:

Vector<double> v1 = new DenseVector(new double[] { 1, 2, 3 });     
Vector<double> v2 = new DenseVector(new double[] { 3, 2, 1 });
Run Code Online (Sandbox Code Playgroud)

我基本上想要CrossProduct他们,但找不到官方功能.我知道交叉产品是一个非常简单的功能,我可以自己编写,但我想使用API​​的功能.

以下两个对我有用:(无法在API中找到此类函数.)

Vector<double> result = v1.CrossProduct(v2);
Vector<double> result = Vector.CrossProduct(v1,v2);
Run Code Online (Sandbox Code Playgroud)

我找到了这个,但是当我尝试编写它时找不到该函数:API Reference

c# numeric mathnet-numerics math.net

7
推荐指数
2
解决办法
8419
查看次数

使用Math.Net的基于指数的曲线拟合

我是Math.Net库的新手,我在尝试基于指数函数进行曲线拟合时遇到了问题.更具体地说,我打算使用这个功能:

f(x) = a*exp(b*x) + c*exp(d*x)
Run Code Online (Sandbox Code Playgroud)

使用MATLAB我得到了相当不错的结果,如下图所示:

胡说

MATLAB计算以下参数:

f(x) = a*exp(b*x) + c*exp(d*x)
Coefficients (with 95% confidence bounds):
a =   29.6       ( 29.49     , 29.71)
b =    0.000408  (  0.0003838,  0.0004322)
c =   -6.634     ( -6.747    , -6.521)
d =   -0.03818   ( -0.03968  , -0.03667)
Run Code Online (Sandbox Code Playgroud)

是否可以使用Math.Net实现这些结果?

c# matlab curve-fitting mathnet-numerics

7
推荐指数
1
解决办法
3411
查看次数

Cuda Native Provider - 缺少MathNet.Numerics.CUDA.dll

关于nuget的Math.Net 3.7.0发行说明提到了一个CUDA本机提供程序.

Control.UseNativeCUDA();
Run Code Online (Sandbox Code Playgroud)

抛出MathNet.Numerics.CUDA.dll的DllNotFoundException.对于MKL提供者,我需要安装额外的NuGet-Package.CUDA.dll还没有包吗?或者我需要安装什么?

我正在使用带有mono的Linux上的MathNet.

mathnet-numerics math.net

6
推荐指数
1
解决办法
1030
查看次数

在解析的等式中从复数中获取REAL和IMAG

我正在评估Math.NET Symbolics,以便在我们的应用程序中使用,我们需要一个简单的数学解析器,供用户根据我们的测量数据计算自定义方程.我们的数据采用复数形式.

要测试我在LINQPad中使用以下代码片段:

var complexA = new Complex(1, 1);
var complexB = new Complex(1, 2);
var symbols = new Dictionary<string, FloatingPoint>()
    {
        { "a", complexA },
        { "b", complexB }
    };

Evaluate.Evaluate(symbols, Infix.ParseOrUndefined("1/(a*b)+cos(b)")).ComplexValue.Dump();
Run Code Online (Sandbox Code Playgroud)

这很好用,但是我找不到以下运算符:
我们如何获得符号的REAL或IMAGINARY部分?

我试过real(b)imag(b),但没有奏效.

作为一种解决方法,我也可以做以下事情,但我更喜欢像我这样的运营商abs(b):

var complexA = new Complex(1, 1);
var complexB = new Complex(1, 2);
var symbols = new Dictionary<string, FloatingPoint>()
    {
        { "a", complexA },
        { "b", complexB },
        { "b_REAL", complexB.Real },
        { "b_IMAG", …
Run Code Online (Sandbox Code Playgroud)

c# symbolic-math mathnet-numerics mathdotnet-symbolics math.net

6
推荐指数
0
解决办法
91
查看次数

DebuggerTypeProxy用于泛型类型层次结构

我正在尝试在Math.NET Numerics中为矩阵和向量编写调试器类型代理/代理,因此调试器显示更多有用的信息(也在F#FSI中).类型层次结构如下:

  • Generic.Matrix<T>
  • Double.Matrix : Generic.Matrix<double>
  • Double.DenseMatrix : Double.Matrix

什么有效

具有封闭泛型类型的非泛型代理.如果代替Matrix<double>构造函数接受a Double.Matrix或a,它也可以以相同的方式工作Double.DenseMatrix.

public class MatrixSummary
{
    public MatrixSummary(Matrix<double> matrix) { }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后,用以下内容装饰Double.DenseMatrix:

[DebuggerTypeProxy(typeof(MatrixSummary))]
Run Code Online (Sandbox Code Playgroud)

我想做什么

我不希望为每种类型实现单独的代理,所以让它通用:

public class MatrixSummary<T> where T : ...
{
    public MatrixSummary(Matrix<T> matrix) { }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后,用以下内容装饰Double.DenseMatrix:

[DebuggerTypeProxy(typeof(MatrixSummary<>))]
Run Code Online (Sandbox Code Playgroud)

或者关闭:

[DebuggerTypeProxy(typeof(MatrixSummary<double>))]
Run Code Online (Sandbox Code Playgroud)

和/或如果需要,也可以将该属性添加到基类.

这些都不起作用,例如在调试单元测试时,即使文档说它在使用开放泛型类型(即MatrixSummary<>)声明属性时应该工作.毕竟它也适用于List<T>等等.

有任何想法吗?

有关:

c# debugging mathnet-numerics math.net

5
推荐指数
1
解决办法
1016
查看次数

MathNet.Numerics与Matlab正向傅立叶解答不匹配?

我有点卡在这里。MathNet Numerics的Forward Fourier结果似乎比MATLAB的结果少一半。

WindowsPhone 8上的MathNet.Numerics

Complex[] samples = { new Complex(5, 0), new Complex(6, 0), new Complex(1, 0), new Complex(2, 0), new Complex(5, 0) };
MathNet.Numerics.IntegralTransforms.Transform.FourierForward(samples);
MathNet.Numerics.IntegralTransforms.Transform.FourierInverse(samples);
Run Code Online (Sandbox Code Playgroud)

原始信号

(5,0)(6,0)(1,0)(2,0)(5,0)

前向傅立叶

8.4970583144992,4.96506830649455E-16)(2.67082039324994,-0.162459848116454)(-1.32917960675006,-0.688190960235587)(-1.32917960675006,0.688190960235586)(2.67082039324994,0.162459848116454)

逆傅立叶

(5,-1.24126707662364E-15)(6,0)(1,1.78742459033804E-15)(2,9.93013661298909E-16)(5,7.94410929039127E-16)

Matlab FFT和IFFT

原始信号

x = [5,6,1,2,5]

前向傅里叶fft(x)

ANS = 19.0000 5.9721 - 0.3633i -2.9721 - 1.5388i -2.9721 + 1.5388i 5.9721 + 0.3633i

傅里叶逆傅里叶变换(ans)

5.0000 6.0000 1.0000 2.0000 5.0000

有任何想法我在这里做错了吗?

matlab signal-processing fft c#-4.0 mathnet-numerics

5
推荐指数
1
解决办法
4504
查看次数

什么是numpy.where的Math.NET等价物?

我正在将一段目前使用numpy的python代码移植到IronPython(其原因与我正在编写的平台的细节有关).

由于numpy和IronPython不兼容,我需要用Math.NET等效替换每个numpy函数,我已将其作为外部引用添加.

作为Math.NET的新手,我很难找到相应的numpy.where()函数.

任何帮助将不胜感激!

python ironpython numpy mathnet-numerics rhinoceros

5
推荐指数
0
解决办法
540
查看次数

与R相比,慢矩阵运算

以下计算运行速度比R慢得多:

let result = (X.Transpose() * b * X).Inverse() * (X.Transpose() * b) * e // about 4 seconds on my machine
Run Code Online (Sandbox Code Playgroud)

或这个:

let result = (X.Transpose() * b * X).QR().Solve((X.Transpose() * b) * e)
Run Code Online (Sandbox Code Playgroud)

哪里

open MathNet.Numerics.LinearAlgebra

let X = DenseMatrix.init 2000 7 (fun i j -> 1.)
let b = SparseMatrix.ofDiag (vector [for i in 0 .. 1999 do yield 1.])
let e = DenseMatrix.init 2000 1 (fun i j -> 1.)
Run Code Online (Sandbox Code Playgroud)

但是在R中,通过以下方法可以实现相同的计算,只需要几百毫秒:

result <- solve(crossprod(X,b*X), crossprod(X,b*e)) // …
Run Code Online (Sandbox Code Playgroud)

f# mathnet-numerics

5
推荐指数
0
解决办法
164
查看次数

在多元回归中获得每个系数的R,P值和T统计量(math.net)

我正在使用https://numerics.mathdotnet.com/Regression.html作为参考.我尝试在下面的代码中获取每个自变量的r值,但我不知道这是否正确,如果这是正确的方法,那么如何获得p值和T统计量.

这是我目前的代码:

var ema12 = calc.ListCalculationData.Select(i => (double)i.Ema12).ToArray();
var ema26 = calc.ListCalculationData.Select(i => (double)i.Ema26).ToArray();
var ema = calc.ListCalculationData.Select(i => (double)i.Ema).ToArray();
var targetvalue = calc.ListCalculationData.Select(i => (double)i.MRTargetValue).ToArray();
var matrixArray = CreateMatrix.DenseOfColumnArrays(ema12, ema26, ema);
var vectorArray = CreateVector.Dense(targetvalue);
var items = MultipleRegression.QR(matrixArray, vectorArray);
var r1 = GoodnessOfFit.RSquared(ema12, vectorArray);
var r2 = GoodnessOfFit.RSquared(ema26, vectorArray);
var r3 = GoodnessOfFit.RSquared(ema, vectorArray);
Run Code Online (Sandbox Code Playgroud)
  1. 这是获取每个自变量的R值的正确方法吗?
  2. 如何获得每个自变量的P值和T统计量?
  3. 另外,要检查2个自变量之间的多重共线性,下面的代码是否正确?

    var multiCol = GoodnessOfFit.RSquared(ema12,ema26);

c# regression mathnet-numerics

5
推荐指数
0
解决办法
377
查看次数