2011-01-10 32 views
1

我試圖找到一種優雅的方式來應對斯卡拉多維集合。我的理解是我最多可以有使用製表,如在下面的2維陣列的情況下的5維的集合:尺寸的集合,以及如何遍歷它以高效,優雅的方式

val test = Array.tabulate[Double](row,col)(_+_) 

,我也可以使用訪問該陣列的元件

for(i<-0 until row) { 
     for(j<-0 until col) { 
     test(i)(j) = 0.0 
     } 
    } 

如果我不知道先驗就是我將要處理,可能是什麼確定集合的結構簡潔的方式,並跨越它,沒有做這樣的事情:

case(Array(x)) => 
     for(i<-1 until dim1) { 
      test(i) = 0.0 
     } 

    case(Array(x,y)) => 
     for(i<-1 until dim1) { 
      for(j<-1 until dim2) { 
       test(i)(j) = 0.0 
      } 
     } 

    case(Array(x,y,z)) => 
    ... 

尺寸值n1,n2,n3等......是私人的,對吧?此外,對於n維對象交易時將使用一個展開2-d陣列的相同特技到1-d矢量,如果我想單例處理遍歷?

在此先感謝

布魯斯

回答

4

我會用遞歸和模式在這種情況下匹配:

def doSome(a:Array[_]){ 
    for(i <- a){ 
     i match{ 
     case x:Array[_] => doSome(x) 
     case x => println(x) // do something sensible here 
     } 
    } 
}

1

首先,一些更正:

val test = Array.tabulate[Double](row,col)(_+_) 

這將產生一個Array[Array[Double]],和每一個零元素的最簡單的方法是:

test foreach { inner => in.indices foreach { _ => 0.0 } } 

你在哪裏循環在由外陣列包含在每個內陣列,和用於內陣列更新每個元素。有沒有必要知道要素的實際數量,也不是希望這樣做(試想一下,這樣做與並行陣列!)

這將是更容易使用map,並與陣列工作雖然它是不可改變的,但這似乎違背了原始請求的精神,因此很快地移動...

除了誤解從列表函數返回的多維數組的性質(例如嵌套數組的陣列)。您也正在使用模式匹配,就像它是一個Java switch語句一樣,這是不正確的。要匹配不同維度的數組,你需要這樣的東西:

case Array[Double] => ... 
case Array[Array[Double]] => ... 

但我建議不要這種方法。這不會是容易的類型系統安全表達的,你已經確切地知道根據你提供的

+0

由於參數的個數從製表返回什麼類型的,這有助於我的理解。 – 2011-01-10 22:19:16