经过一番研究,我决定在c#中使用ILNumerics作为线性代数包。
然而,我在向量的范围上有一些问题。我想用移动窗口类型修改矢量中的值,对该窗口或范围中的值应用函数。
关于如何实现这一点有什么想法吗?我在文档中找不到怎么做。
这就是我要做的操作:
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的基础知识以及如何处理不同的数组类型。特别是,防止var与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);
@编辑:从评论中…这可能会让我们更接近你想要达到的目标。
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-dim数组的情况。