在c# ILNumerics Vector上操作

本文关键字:操作 Vector ILNumerics | 更新日期: 2023-09-27 18:04:22

经过一番研究,我决定在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);

这将不起作用,因为范围不正确,并且不能使用索引写入向量。

谢谢。

在c# ILNumerics Vector上操作

我有点不确定我的理解是否正确。但你当然可以修改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数组的情况。