我想用ILNumerics绘制一些3D表面.我注意到,如果我旋转它,ILCube不会保持表面的形状,这是因为它试图使立方体适合ILPanel.但是,如果我使用ILCamera,它将保持形状,但周围没有立方体.这是一个例子,
private void ilPanel1_Load(object sender, EventArgs e)
{
var scene = new ILScene();
ILArray<float> A = ILSpecialData.torus(0.75f, 0.25f);
var sf = new ILSurface(A);
var pc = new ILPlotCube();
pc.TwoDMode = false;
scene.Add(pc);
pc.Add(sf);
sf.Colormap = Colormaps.Jet;
var cb = new ILColorbar();
cb.Location = new PointF(1, .1f);
sf.Children.Add(cb);
ilPanel1.Scene = scene;
}
Run Code Online (Sandbox Code Playgroud)
结果是
而对于ILCamera
private void ilPanel1_Load(object sender, EventArgs e)
{
var scene = new ILScene();
ILArray<float> A = ILSpecialData.torus(0.75f, 0.25f);
var sf = new ILSurface(A);
var cam = scene.Camera;
cam.Add(sf); …
Run Code Online (Sandbox Code Playgroud) 我对ILNUmerics非常感兴趣,想尝试免费版,但我遇到了麻烦.
我已经开始使用控制台应用程序,并试图运行'hello ilnumerics'console应用程序,但我注意到VS无法找到MKL库.
我在Windwos 8下使用VS2012(在2010年中期的MacBook Pro上通过Bootcamp;它是否相关); 我已从Project解决方案中安装了NuGet Packages扩展.然后右键单击解决方案资源管理器中的引用,"管理Nu获取包",在线/搜索各种版本的ilnumerics.我选择'ILNumerics'并安装.我将'ILNumerics'和'ILNumerics.Native'添加到我的项目中.然后我可以在解决方案资源管理器中的"引用"下看到ILNumerics并获得两个新文件夹/ bin32 /和/ bin64 /它们都包含两个名为libiomp5md.dll和mkl_custom.dll的DLL.我检查了他们的'复制到输出目录'属性,他们都设置为'复制如果更新'.
显然找不到mkl_custom.我从快速入门指南中编写了以下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ILNumerics;
namespace ConsoleApplication3
{
class Program : ILMath
{
static void Main(string[] args)
{
ILArray<double> A = array<double>
(new double[] { 1,1,1,1,1,2,3,4,1,3,6,10,1,4,10,20} ,4, 4);
ILArray<double> B = counter(4, 2);
ILArray<double> Result = linsolve(A, B);
Console.Out.WriteLine("A: " + Environment.NewLine +
A.ToString());
Console.Out.WriteLine("B: " + Environment.NewLine + B.ToString());
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到此异常:ILNumerics.dll中出现未处理的"System.DllNotFoundException"类型异常
附加信息:无法加载DLL'mkl_custom':找不到指定的模块.(来自HRESULT的异常:0x8007007E)
如果我不调用linsolve,ILArray的ToString方法确实有效:如果我发表评论// ILArray Result = …
我最近正在研究 C# 中的数值算法。因此我做了一些实验来寻找最适合.NET 的数学库。我经常做的一件事是评估目标函数,这些函数通常是将向量作为输入并返回向量作为输出的函数。我比较了 ILNumerics、系统数组和 Math.NET 中相同目标函数的实现。ILNumerics 的语法确实使其脱颖而出,因为它类似于 MatLab 和 R 的冗长数学公式。然而,我发现对于相同数量的评估,ILNumerics 似乎比 Math.NET 的任何一个系统数组花费的时间都要长得多。下面是我用来比较的代码。我在这里不做任何线性代数,只是纯粹将数学公式应用于长向量。
[Test]
public void TestFunctionEval()
{
int numObj = 2;
int m = 100000;
Func<double[], double[]> fun1 = (x) =>
{
double[] z = new double[numObj];
z[0] = x[0];
double g = 1.0;
for (int i = 1; i < x.Length; i++)
g = g + 9.0 * x[i] / (m - 1);
double h = 1.0 - Math.Sqrt(z[0] / g);
z[1] = g * h; …
Run Code Online (Sandbox Code Playgroud) 在尝试将以下C#代码翻译为F#时,我正在努力使用'using'关键字.以下代码段来自ILNumerics库.如何翻译以下内容?
ILRetArray<double> ObjFuncBFGS2D(ILInArray<double> X) {
using (ILScope.Enter(X)) {
return X[0] * X[0] + X[1] * X[1] + 2;
}
}
Run Code Online (Sandbox Code Playgroud)
另外,F#人们倾向于使用哪些库进行优化?我一直在使用NLoptNet,但是在Matlab,Julia和Python中正确收敛的例程存在非常奇怪的收敛问题.所以问题在于我的F#翻译(更有可能授予)或优化库.这是我希望确定的.坦率地说,我对互联网上缺乏与F#相关的数值优化材料感到有些惊讶.
我刚刚下载了 ILNumerics 的最新版本,可用于我的 F# 项目。是否可以在 F# 中利用这个库?我尝试过简单的计算,但看起来很麻烦(在 F# 中)。
我想设置一个有约束(甚至无约束)的优化问题。通常的 Rosenbrock 函数会做,然后我将使用我自己的函数。我什至很难定义一个数组。我可以定义的唯一类型的数组是 RetArray,例如使用此代码
let vector = ILMath.vector<float>(1.0, 2.0)
Run Code Online (Sandbox Code Playgroud)
编译器表示 vector 是一个 RetArray;我认为这是因为它是从函数返回的(即:ILMath.vector)。如果我定义另一个类似的向量,我可以 -eg- 求和向量,简单地写,例如
let a = ILMath.vector<float>(1.0, 2.0)
let b = ILMath.vector<float>(3.2,2.2)
let c = a + b
Run Code Online (Sandbox Code Playgroud)
我得到
RetArray<float> = seq [4.2; 4.2]
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试检索 c 的值,再次写入,例如在 FSI 中,
c;;
Run Code Online (Sandbox Code Playgroud)
我得到
错误:未将对象引用设置为对象的实例。
在 F# 中使用 ILNumerics 的建议方法是什么?是否可以在 F# 中本地使用该库,或者我被迫从 C# 库调用我的 F# 代码以使用整个 ILNumerics 库?除了引用的问题之外,当我在 F# 中移植时,我在理解 ILNumerics 的基本逻辑方面存在问题。
例如,示例代码中使用作用域的 C# 的 F# 等效项是什么,如下所示:
using (ILScope.Enter(inData)) { ...
}
Run Code Online (Sandbox Code Playgroud) 我想将以下 Matlab 代码转换为 C#:
nfft=2^nextpow2(nn);
Run Code Online (Sandbox Code Playgroud)
其中NEXTPOW2(N)
表示 Matlab 中 2 的下一个更高的幂。
那么我们如何自己用C#代码或者借助ilnumerics Lab来实现同样的功能呢?
ILNumerics中"(!0)"的含义就像这样
return (!0)ILMathInternal.exp(this.m_mu);
Run Code Online (Sandbox Code Playgroud)
并且像这样,
return 0.5 + (!0)ILMathInternal.log(this.m_sigma) + this.m_mu + (!0)ILMathInternal.log(ILMathInternal.sqrt(2.0 * ILMathInternal.pi));
Run Code Online (Sandbox Code Playgroud)
为什么我们使用这种表达式 - "(!0)"?