经过一些研究,我选择了使用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维数组的情况。

08-24 15:56