2016-03-20 29 views
0

C# .NET'te üç boyutlu dairesel bir arabellek uygulanmasını ve arabelleğin dilimlerini çıkarmamı sağlıyorum.Üç boyutlu dairesel arabellek

Çok boyutlu diziyi denedim ancak arabelleğin belirli bir dilimini almama izin vermiyor.

Ayrıca, jagged dizisini kullanarak bir sürüm uygulamayı denedim, ancak matrisin nasıl biçimlendirileceğini ve ayrıca dilim ayıklama işleminde bazı problemler buldum.

Yardımlarınız için teşekkürler.

[EDIT 1] Tampon, reltime sensörlerinden veri saklamak için kullanılacaktır, genişlik yüksekliğinde sabitlenecektir ve derinlik (dairesel kısım olan zaman) kullanıcı tarafından tanımlanacaktır.

İhtiyacım olan dilimler sabit bir boyutta bir matris olacaktır (genişlik ve belirli bir zamandaki verilere sahip).

[EDIT 2] Bu uygulamaları uygulayabildiğim tek uygulama. ben hala bildirim sırasında sıkışıp kaldım pürüzlü dizi ile Doğru ihtiyaçlarınızı anlamak

public class CircularBufferMatrix<T> 
{ 
    private readonly T[,,] _buffer; 

    public CircularBufferMatrix(int width, int height, int depth) 
    { 
     Width = width; 
     Height = height; 
     Depth = depth; 
     _buffer = new T[width, height, depth]; 
    } 

    public T this[int x, int y, int z] 
    { 
     set { _buffer[x, y, z%Depth] = value; } 
     get { return _buffer[x, y, z%Depth]; } 
    } 

    #region Getters 

    public int Width { get; } 

    public int Height { get; } 

    public int Depth { get; } 

    #endregion 
} 
+0

Hmmm, bence gereksinimlerinizde daha hassas olmanız gerekiyor! İstediğiniz dilimler daima aynı boyutta ve örneğin aynı verileri içeriyor mu? – Skizz

+0

@Skizz Merhaba, sorumu güncelledim, yardım için teşekkürler –

+0

Hoşgeldiniz. Gösterilecek herhangi bir kod var mı? – MickyD

cevap

1

Bunları iki sınıfta ayırırdım. Okuma ve yazma işlerini yürüten bir CircularBuffer sınıfı gibi bir şey istiyorsun. Diğeri, saklamak istediğiniz 2D dizisinin bir uygulaması olabilir. Bunları ayırmanın nedeni, ayrı ayrı Okuma/yazma çerçeveleri yapmak istediğiniz içindir. Örneğin

:


Dairesel tampon uygulaması: Bu okuma özen ve/dilimleri induvidual 'çerçeveleri' yazılı olacak

public class CircularBuffer<T> 
{ 
    private T[] _buffer; 

    private int IncRollover(int value) 
    { 
     value++; 
     if (value >= _buffer.Length) 
      value = 0; 

     return value; 
    } 

    public CircularBuffer(int count) 
    { 
     _buffer = new T[count]; 
    } 

    public bool Write(T element) 
    { 
     // if the writeindex (after increasing) equals the readindex, the buffer is full 
     var newWriteIndex = IncRollover(WriteIndex); 
     if (newWriteIndex == ReadIndex) 
      return false; 

     _buffer[WriteIndex] = element; 

     WriteIndex = newWriteIndex; 
     return true; 
    } 

    public bool TryRead(out T element) 
    { 
     if (ReadIndex == WriteIndex) 
     { 
      element = default(T); 
      return false; 
     } 

     element = _buffer[ReadIndex]; 
     ReadIndex = IncRollover(ReadIndex); 

     return true; 
    } 

    public IEnumerable<T> ReadAll() 
    { 
     T element; 
     while (TryRead(out element)) 
      yield return element; 
    } 


    public int ReadIndex { get; private set; } 
    public int WriteIndex { get; private set; } 
} 

. Dizin'de okumak isterseniz bu sınıfı genişletebilirsiniz.

not:

public class MyWhateverBuffer<T> 
{ 
    private CircularBuffer<T[,]> _buffer; 

    public int Width { get; private set; } 
    public int Height { get; private set; } 
    public int Depth { get; private set; } 

    public MyWhateverBuffer(int width, int height, int depth) 
    { 
     Width = width; 
     Height = height; 
     Depth = depth; 
     _buffer = new CircularBuffer<T[,]>(depth); 
    } 

    public T[,] New() 
    { 
     return new T[Width, Height]; 
    } 

    public bool Add(T[,] buffer) 
    { 
     return _buffer.Write(buffer); 
    } 

    public bool TryRead(out T[,] buffer) 
    { 
     return _buffer.TryRead(out buffer); 
    } 

    public IEnumerable<T[,]> ReadAll() 
    { 
     return _buffer.ReadAll(); 
    } 
} 

: tampon


Bu Dairesel tampon içinde depolanan 2d tamponların bir uygulama olabilir doluysa yazma return false Bu sınıf aşağıdaki gibi kullanılabilir:

MyWhateverBuffer<double> myBuffer = new MyWhateverBuffer<double>(100, 100, 100); 

var oneSlice = myBuffer.New(); 

oneSlice[10, 10] = 3.5; 
oneSlice[50, 10] = 23.5; 
oneSlice[10, 20] = 43.5; 

myBuffer.Add(oneSlice); 

var anotherSlice = myBuffer.New(); 

anotherSlice[10, 10] = 13.5; 
anotherSlice[50, 10] = 23.5; 
anotherSlice[10, 20] = 43.5; 

var result = myBuffer.Add(anotherSlice); 

if(!result) 
{ 
    // the buffer was full.. 
} 

// Read the results from the buffer. 
foreach(var slice in myBuffer.ReadAll()) 
{ 
    Trace.WriteLine(slice[10, 10]); 
} 

Her zaman arabelleğin eklenip eklenmeyeceğini kontrol etmelisiniz. Bilgi kaybetmek istemezsin.


Yan Not: Bir Dairesel tampon ile

en kar kazanç unsurları olanları beyan eder. Büyük diziler gibi her zaman yeniden kullanılacaktır.

0

, bir dairesel tampon veri ve verinin iki boyutlu diziler maddeden oluşan istiyorum (i kaotik bulmak) bir öğeden diğer öğelerde hiçbir zaman tekrarlanmaz. C# bir cicular tampon türü yok ama sen hep tek kendiniz oluşturabilirsiniz: -

public class CircularBuffer <T> // make it generic 
{ 
    public class Iterator 
    { 
    public void MoveForward(); 
    public void MoveBackward(); 
    public T Item { get { } }; 

    CicrcularBuffer <T> m_container; 
    LinkedListNode <T> m_current_item; 
    } 

    public void Add (T item); 
    public Iterator GetIterator(); 

    LinkedList<T> m_data; 
} 

Ardından verileri içeren bir sınıf oluşturmak: -

public class SensorData 
{ 
    // contains the two dimension data 
} 

Ve gibi kullanın: -

Açıkçası, doldurulması gereken çok şey var ama başlamanızı sağlamalı.