2016-11-26 13 views
0

浮動小数点の汎用変換を行い、任意の数の配列を返すことは可能ですか?一般的なストライドでアレイを分割しますか?

おそらく、配列を使って任意の再帰を行う方法がわかりません。あなたは、可変サイズのタプルを返すことができない場合、ストライド2

VectorOut=[[-0.23,0.24,4.0],[-5.2,-1.4,10.2]] 

出力ベクトルによって場合ストライド3

VectorOut=[[-0.23,-1.4],[-5.2,4.0],[0.24.10.2]] 


func splitArray<T:FloatingPoint>(Vector x:[T], byStride N: Int)->([T],[T],...[byStride]) 
{ 
    guard (x.count % byStride == 0) else {"BOMB \(#file) \(#line) \(#function)" 
    return [NaN] 
}  

var index:[Int] = [Int](repeating: 0.0, count: byStride) 
var bigVector:[[T]] = [T](repeating: 0.0, count: byStride) 

for idx in index { 

for elem in stride(from:idx, to: x.count - 1 - idx, by:byStride){ 
bigVector[idx]=x[idx] 
    } 
} 
return bigVector 


} 
+0

表示するサンプル入力と所望の出力、ください。 – matt

答えて

1

によって

例 入力ベクトル

Vector:[CGFloat] = [-0.23,-5.2,0.24,-1.4,4.0,10.2] 

出力ベクトル。あなたができることは にネストされた配列を返すことです。

例(私が正しく問題を解釈することを期待して):

func splitArray<T>(vector x:[T], byStride N: Int) -> [[T]] { 
    precondition(x.count % N == 0, "stride must evenly divide the array count") 
    return (0..<N).map { stride(from: $0, to: x.count, by: N).map { x[$0] } } 
} 

let a = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0] 

print(splitArray(vector: a, byStride: 2)) 
// [[1.0, 3.0, 5.0], [2.0, 4.0, 6.0]] 

print(splitArray(vector: a, byStride: 3)) 
// [[1.0, 4.0], [2.0, 5.0], [3.0, 6.0]] 

説明:(0..<N).map { ... }サイズNのアレイを作成します。各値$0について 、

stride(from: $0, to: x.count, by: N).map { x[$0] } 

インクリメントNとインデックス$0始まるxの "ストライド" を作成する:

[ x[$0], x[$0+N], x[$0+2*N], ..., x[x.count-N+$0] ] 
+0

ありがとう!はい、私は何をしようとしていたのですが、再帰が行く方法かもしれないと思ってストライドに基づいて出力を動的に割り当てます。このタイプのジェネリックでは、それは同等のものを処理しますか? –

+0

@GAlexander:この関数は 'T'に制限を設けません。* any *配列で動作します。 –

関連する問題