按索引范围从矢量中选择元素



尽管进行了一些谷歌搜索,但我找不到任何关于如何做到这一点的信息。

如果我想获取数组的一些元素,我可以进行

var partOfArray = myArray[firstIndex..lastIndex];
var anotherpartOfArray = myArray[firstIndex..^1];

我可以对Vector类型的东西做同样的操作吗?类似的东西

// Vector<double> myVector; 
var partOfVector = myVector(firstIndex..lastIndex);

目前,我唯一的解决方法是将向量转换回数组,对其进行索引,然后将其转换回向量。必须有一种更简单的方法来做到这一点。

编辑:有人指出,MathNet.Numerics.LinearAlgebra类型不支持范围索引。我发现最好的解决方案是使用:

var partOfVector=myVector.SubVector(startIndex,samplesToTake(;

编辑:这个答案是假设使用了System.Numerics.Vector

这似乎是不可用的;可计数的";使用隐式范围索引的要求:

  1. 类型为Countable
  2. 该类型具有一个可访问的实例索引器,该索引器将单个int作为参数
  3. 该类型没有将Index作为第一个参数的可访问实例索引器。Index必须是唯一的参数,否则其余参数必须是可选的

";可计数的";在此上下文中,意味着具有CountLength实例属性,Vector<T>仅具有静态Count属性。

请注意,Vector<T>用于高性能SIMD优化,即它等价于c++向量,不幸的是,这通常意味着性能将牺牲便利性。如果将向量转换回数组,然后再转换回数组可能会显著降低矢量化的好处。在不了解具体应用的情况下,很难提供更好的建议。

我还建议阅读SIMD的本质。我从那篇文章中得出的结论是,与本质相比,Vector<T>的收益相当适中,即使后者最终是特定于平台的。

MathNet.Numerics.LinearAlgebra不支持范围索引,因此您可以做的最接近的事情如下:

var partOfVector = myVector.SubVector(firstIndex, lastIndex - firstIndex + 1); 

最新更新