经过一些研究,我选择了使用C#中的Linear Algebra软件包的ILNumerics。
但是我在向量范围上有一些问题。我想使用一种移动窗口来修改Vector中的值,并对该窗口或范围中的值应用函数。
关于如何做到这一点的任何想法?我在文档中找不到如何执行此操作。
这是我要执行的操作:
ILArray<double> vec = ILMath.array(new [] {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0});
Console.WriteLine(vec);
// create a vector range from index 3-5
var range = vec[2, 5];
Console.WriteLine(range);
// modify all values in range
for (int i = 0; i < range.Length; i++)
range[i] += 10.0;
Console.WriteLine(range);
// view modified original vector
Console.WriteLine(vec);
这将不起作用,因为范围不正确,并且无法使用索引将向量写入。
谢谢。
最佳答案
我不确定我是否正确理解了这一点。但是您当然可以修改ILArray。只要确保您了解使用ILArray的基础知识以及如何处理不同的数组类型即可。特别是prevent from using var in conjunction with ILArray!
阅读有关核心阵列功能的信息:
http://ilnumerics.net/docs-core.html
阅读如何创建函数并处理不同的ILNumerics数组类型:
http://ilnumerics.net/GeneralRules.html
我已经修改了您的示例。如果这不是您所需要的,请对此发表评论:
ILArray<double> vec = ILMath.array(new[] { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 });
Console.WriteLine(vec);
// create a vector range from index 3-5
ILArray<int> range = array<int>(2,3,4,5);
Console.WriteLine(range);
// modify all values in range
for (int i = 0; i < 3; i++) // make tree steps. Modify as needed!
vec[range + i] = vec[range + i] + i;
Console.WriteLine(range);
// view modified original vector
Console.WriteLine(vec);
@Edit:从评论...这可能使我们更接近您想要达到的目标?
for (int i = 0; i < 3; i++) // make tree steps. Modify as needed!
// dynamic subarrays using ILMath.r()
vec[r(i,i+5)] = vec[r(i,i+5)] + ... ;
请注意,如果未在从ILMath派生的类中定义代码,则必须使用
ILMath.r(..)
而不是r(..)
。还要注意,可以将带有r()
的子数组范围定义与字符串定义任意组合。这可能有助于将其转换为涉及矩阵或n维数组的情况。