1

全体としていくつかの計算を行う必要があるため、Math.net ベクトルにいくつかのデータを格納しています。このデータには、収集された時間情報が付属しています。たとえば、次のようになります。

Initial = 5, Time 2 = 7, Time 3 = 8, Time 4 = 10

したがって、データを Vector に格納すると、次のようになります。

stateVectorData = [5,7,8,10]

ここで、ベクトルの単一のエントリを抽出する必要がある場合があります。しかし、私はインデックス自体を持っていませんが、時間情報を持っています. だから私がしようとしているのは、時間の情報と私のstateVectorのデータのインデックスを持つ辞書です。

Dictionary<int, int> stateDictionary = new Dictionary<int, int>(); //Dict(Time, index)

新しいデータを取得するたびに、エントリを辞書に (そしてもちろん stateVector にも) 追加します。だから時間2で私はした:

stateDictionary.Add(2,1);

これで、ベクトルを変更しない限り機能します。残念ながら、ベクター内のエントリが古くなりすぎた場合、そのエントリを削除する必要があります。時間 2 が古すぎると仮定して、2 番目のエントリを削除すると、次のベクトルが得られます。

stateVector = [5,8,10]

現在、私の辞書には間違ったインデックス値が保存されています。
これを解決する方法として、2 つの解決策が考えられます。

  1. ディクショナリをループして、すべての値 (キー > 2) を 1 ずつ減らします。
  2. もっとエレガントだと思うのは、インデックスの代わりにベクトルエントリへの参照を辞書に保存することです。

だから何か

Dictionary<int, ref int> stateDictionary =
    new Dictionary<int, ref int>(); //Dict(Time, reference to vectorentry)
stateDictionary.Add(2, ref stateVector[1]);

このようなものを使用すると、ベクトル内のいくつかのエントリを削除してもかまいません。残りのベクトル エントリへの参照がまだ残っているからです。これで、C# に参照を格納することはできないことがわかりました。

だから私の質問は、辞書全体をループすることに代わるものはありますか? または、現時点では辞書を使用しない別の解決策はありますか?

編集してjuharrに答えてください:時間情報は常に1ずつ増加するとは限りません。いくつかの並列実行プロセスとそれにかかる時間によって異なります。おそらく1から3の間で増加します。しかし、それ以上になる可能性もあります。ベクトルには削除されない値がいくつかあります。ベクトルにとどまる初期値 5 でこれを表示しようとしました。

編集 2:
ベクターには、少なくとも 5000 から 6000 の要素が格納されます。リアルタイムで処理できる要素によって制限されるため、現時点では最大値は定義されていません。そのため、私の場合、さらに計算するには約 0.01 秒かかります。これが、ベクトル内の要素の数を増やす (または、ベクトル エントリの最大「年齢」を増やす) ことができるように、効果的な方法を検索する理由です。
値を追加するために必要な数の約 3 倍の計算には、ベクトル全体が必要です。
頻度が最も低いエントリを削除する必要があります。そして、時間キーによって単一の値を見つけることが最もよくあるケースです。たぶん1秒間に30回から100回。

これはすべて非常に未定義に聞こえることを知っていますが、パーツの検索と削除の頻度は他のプロセスに依存し、大きく異なる可能性があります。

あなたが私を助けてくれることを願っていますが。これまでありがとう。

編集 3:
@Robinson
ベクトル全体が必要な正確な回数は、並列プロセスにも依存します。最小は反復ごとに 2 回 (つまり、0.01 秒で 2 回)、反復ごとに少なくとも 4 ~ 6 回です。
繰り返しますが、ベクトルのサイズは最大化したいものです。したがって、非常に大きいと想定されます。

解決策の編集:
まず、私を助けてくれたすべての人に感謝します。
少し実験した後、次の構造を使用しています。
リストを使用して、インデックスを状態ベクトルに保存します。さらに、ディクショナリを使用してタイム キーをリスト エントリに割り当てます。そのため、状態ベクトル内の何かを削除すると、リストのみをループします。これは、辞書をループするよりもはるかに高速に見えます。

つまり、次のとおりです。

stateVectorData = [5,7,8,10]
IndexList = [1,2,3];
stateDictionary = { Time 2, indexInList = 0; Time 3, indexInList = 1; Time 4, indexInList = 2 }
TimeKey->stateDictionary->indexInList -> IndexList -> indexInStateVector -> data
4

1 に答える 1

0

これを試すことができます:

public class Vector
{
    private List<int> _timeElements = new List<int>();

    public Vector(int[] times)
    {
        Add(times);
    }

    public void Add(int time)
    {
        _timeElements.Add(time);
    }

    public void Add(int[] times)
    {
        _timeElements.AddRange(time);
    }

    public void Remove(int time)
    {
        _timeElements.Remove(time);
        if (OnRemove != null)
            OnRemove(this, time);
    }

    public List<int> Elements { get { return _timeElements; } }

    public event Action<Vector, int> OnRemove;
}

public class Vectors
{
    private Dictionary<int, List<Vector>> _timeIndex;

    public Vectors(int maxTimeSize)
    {
        _timeIndex = new Dictionary<int, List<Vector>>(maxTimeSize);
        for (var i = 0; i < maxTimeSize; i++)
            _timeIndex.Add(i, new List<Vector>());

        List = new List<Vector>();
    }

    public List<Vector> FindVectorsByTime(int time)
    {
        return _timeIndex[time];
    }

    public List<Vector> List { get; private set; }

    public void Add(Vector vector)
    {
        List.Add(vector);
        vector.Elements.ForEach(element => _timeIndex[element].Add(vector));
            vector.OnRemove += OnRemove;
    }

    private void OnRemove(Vector vector, int time)
    {
        _timeIndex[time].Remove(vector);
    }
}

使用するには:

var vectors = new Vectors(maxTimeSize: 6000);

var vector1 = new Vector(new[] { 5, 30, 8, 20 });
var vector2 = new Vector(new[] { 25, 5, 23, 11 });

vectors.Add(vector1);
vectors.Add(vector2);

var findsTwo = vectors.FindVectors(time: 5);

vector1.Remove(time: 5);

var findsOne = vectors.FindVectors(time: 5);

時間を追加する場合も同じことができます。また、コードは説明のみを目的としています。

于 2015-03-13T05:12:37.183 に答える