2014-04-29 42 views
0

爲了解決一個問題,我已經在這裏Best/Fastest Way To Change/Access Elements of a Matrix重載operator []對於一維數組

問我用一維數組存儲矩陣。但訪問矩陣的元素變成了一項繁瑣的任務。

我目前存儲我的矩陣陣列中這樣

type[numberOfRows * numberOfColumns] myArray; 

並訪問[n][m]元素我必須鍵入此

blargh = myArray[(n*numberOfRows)+m]; 

...我想知道如果它的可能以超載/創建新的運營商[][],將'翻譯'myArray[n][m]myArray[(n*numberOfRows)+m]。如果可能的話,這會妨礙性能太多。

編輯:原來的'強制聯機'方法產生性能增益。實現雙分度(即matrix[r][c]語法)

[MethodImpl(MethodImplOptions.AggressiveInlining)]public void set(int x, int y, T value) 
    { 
     array[(x * wid) + y] = value; 
    } 

    [MethodImpl(MethodImplOptions.AggressiveInlining)]public T get(int x, int y) 
    { 
     return array[(x*wid) + y]; 
    } 
+0

您是否知道[鋸齒狀數組和多維數組](http://msdn.microsoft.com/zh-cn/library/9b9dty7d.aspx)?其中之一可能是你真正想要的。 –

+0

多維數組中的隨機訪問和鋸齒陣列上的列的順序訪問速度太慢。 – Trauer

+0

我希望這兩個都是非常快的。也許混淆以某種方式工作,但實際的隨機/順序訪問會很快。 –

回答

2

不可能爲數組類型重載操作符或更改其定義;這隻能從你無法控制的那種類型的定義中完成。

什麼你可以要做的就是創建自己的類型,它包裝的陣列,而重載所需的運營商:

public class Matrix<T> 
{ 
    private T[] array; 

    public T this[int row, int column] 
    { 
     get { return array[row + column]; } 
    } 
} 

無論在性能上的差異(這應該是小的,但不沒有)是你的程序的一個問題,你需要進行配置和測量。

+0

我喜歡這種方法。只要我回家,我會測試它。 – Trauer

+0

我剛剛測試過,並且使用強制內聯方法可以在性能上獲得性能提升。檢查我的編輯。 – Trauer

+0

@Trauer您是在調試模式下編譯還是沒有優化? – Servy

1

一種方式將是使用Proxy Pattern(也被稱爲代用模式)。

這個想法是重載頂層operator[]以返回一個特殊的對象,該對象「記住」第一個索引和數組,並提供它自己的超載operator[],它將「記憶的」第一級索引與提供第二級索引以產生數據數組中的實際「平坦」索引。

就程序邏輯而言,代理對象代表矩陣的列。這裏是你如何實現這一點:

public class Matrix<T> { 
    private readonly T[] data; 
    private readonly int rowCount; 
    public class Column { 
     private readonly Matrix<T> m; 
     private readonly int r; 
     internal Column(Matrix<T> m, int r) { 
      this.m = m; 
      this.r = r; 
     } 
     public T this[int c] { 
      get { 
       return m.data[m.rowCount*r + c]; 
      } 
     } 
    } 
    public Column this[int r] { 
     get { 
      return new Column(this, r); 
     } 
    } 
} 

這種方法對性能的影響是會有每個要訪問的頂層矩陣時創建的對象。