2016-10-01 1 views
5

DenseVector 클래스에 벡터를 n 번 차이가 나는 메서드를 추가하려고합니다. 다음은 형식 유추는 타입 벡터 형식 DenseVector와 호환되지 않습니다 불평으로 작동하지 않는 것 : 위의 원인이되는 문제에DenseVector 유형에 확장자를 추가 할 수없는 문제

open System 
open System.IO 
open Deedle 
open MathNet.Numerics 
open MathNet.Numerics.LinearAlgebra 
open MathNet.Numerics.LinearAlgebra.Double 
open MathNet.Numerics.Distributions 

[<Extension>] 
type DenseVector with 
    member this.diffVector (v : DenseVector) (n : int) = 
     let rec run (v : DenseVector) (n : int) = 
      match n with 
      | 0 -> v 
      | _ -> run (v.[ 1 .. v.Count-1 ] - v.[ 0 .. (v.Count-1)-1 ]) (n - 1) 
     run v n 

v.[ 0 .. (v.Count-1)-1 ]합니다. 왜 그것이 Vector로 추론되고 DenseVector가 아닌 것은 그 함수에 전달되는 것입니까? 또한 확장 메서드를 올바르게 추가하는 방법은 무엇입니까? 모든 Vector<'T>GetSlice 방법을 정의하는 extension methodVector<'T> 아닌 DenseVector 반환하기 때문에 문제에 대한

+0

열려있는 네임 스페이스를 repro에 포함 할 수 있습니까? – Gustavo

+0

@Gustavo 테스트 결과, MathNet.Numerics.LinearAlgebra.Double'과'MathNet.Numerics.LinearAlgebra'이 인 것으로 나타났습니다. 그리고 그는 MathNet을위한 FSharp 확장 패키지를 가지고 있습니다. – Ringil

+0

죄송합니다. 방금 편집했습니다. –

답변

3

이유입니다. 따라서 GetSlice을 호출하여 작동하는 조각화를 사용하면 Vector가 생성되고 위 코드가 예상대로 작동하지 않습니다.

type Vector with 
    member this.diffVector (v : Vector<'T>) (n : int) = 
     let rec run (v : Vector<'T>) (n : int) = 
      match n with 
      | 0 -> v 
      | _ -> run (v.[ 1 .. v.Count-1 ] - v.[ 0 .. (v.Count-1)-1 ]) (n - 1) 
     run v n 

를 다른 방법으로,이 것을 할 수있다 :

은 내가 MathNet 작업의 내부,하지만 당신은 그냥이 같은 모든 Vector<'T>의 대한 확장 메서드 작업을 할 수 있습니다 방법 확실하지 않다 이와 같은 방법으로 벡터에서 DenseVector로 안전하게 다운 캐스트 할 수 있습니다. 작동하지 않을 수도 있습니다.

[<Extension>] 
type DenseVector with 
    member this.diffVector (v : DenseVector) (n : int) = 
     let rec run (v : DenseVector) (n : int) = 
      match n with 
      | 0 -> v 
      | _ -> let v1 = v.[ 1 .. v.Count-1 ] :?> DenseVector 
        let v2 = v.[ 0 .. (v.Count-1)-1 ] :?> DenseVector 
        run (v1 - v2) (n - 1) 
     run v n 
+0

우수. 약간의 수정은 대신 정적 멤버를 만드는 것입니다. 그런 식으로 사용하기에 조금 더 깨끗해 보입니다. 고맙습니다! –

+2

Math.NET Numerics API는 사용자 코드의 일반 기본 클래스 (항상 특정 DenseVector 멤버에 액세스해야하는 경우에만 다운 캐스트)를 사용한다는 가정하에 최적화되어 있습니다. 따라서 이와 같은 확장 메소드를 일반적인 벡터에 직접 작성하는 것이 좋습니다. 즉,이 대답의 첫 번째 예입니다. –

+1

('Vector '일 수도 있음) –

관련 문제