2017-10-28 10 views
2

私はユニットフル単位のベクトルuと番号tを持っています。duの単位はtypeof(oneunit(u)/oneunit(t))です。私は入力に一致するSArrayまたはMArray出力を構成するコードの単一の一般的な行を探したいと思います。私が試したいくつかのケースがあります:変更されたユニットでどのようにSArray/MArrayを作成しますか?

  1. 明らかにcopy(u)は、このユニットに一致しません。
  2. u/oneunit(t)およびu./oneunit(t)は、いずれもu <: MArrayであっても、SArrayを作成します。 、
  3. similarは常に可変タイプを作成し、それは常にMArray

は私が直接それがなければ一般的なコードに奇妙な枝を追加しますので、痛みになりコンストラクタを(使用する必要があります作成されますが、それが答えであれば問題ありません)?簡単な変換がsimilarながらMArray

u = @MArray [1u"g",2u"g",3u"g"] 
t = 1u"s" 
convert(typeof(u),u/t) 

DimensionError: g and 1.0 g s^-1 are not dimensionally compatible. 

では動作しないこと

編集

例は絶望的である:

u = @SArray [1u"g",2u"g",3u"g"] 
similar(u) 


3-element MVector{3,Quantity{Int64, Dimensions:{}, Units:{g}}}: 
    72559480 g 
581132080 g 
    29791 g 

答えて

1

グレート質問!

基本的には、静的配列のユーザーとして、私はいつもSArrayとそれに対する関数プログラミングアプローチを使用します。 (メモリを管理する必要があるときは、Array{SArray{...}}などを使用し、外側の要素はArrayに置き換えてください)。

おそらく答えはありませんが、私は操作がSArrayを返し、ちょうどSArrayを完全に置き換えることを学ぶという事実を冷やす傾向があります。ほとんどの場合、MArrayを使用するよりも高速ですが、LLVMはヒープ割り当てのMArrayオペレーションではなく、スタック変数のSIMD命令を当然呼び出します。

分裂のような操作が突然変異の能力を保持する(またはしない)と期待していましたか?

編集:はい、コンストラクタを使用するか、convertは完全に実行可能なアプローチです。

+1

ユーザーが特定の理由でタイプを選択しているため、そのことを尊重する必要があるため、これは機能しません。実際の問題は、型が 'SArray {SArray}'か 'MArray {SArray}'であることです。型の変更はどちらの方法でも、型が不変から可変に無作為に変更されたり、その逆に変更されたりすることがないため、アルゴリズムが中断されます。 –

+0

単純な 'convert'が動作しないことを示すためにOPを更新しました。たぶん、パラメータなしで型を引っ張るために必要な、より洗練されたバージョンがあります。 –

2

はどのようにある:与える

static_similar(s, v) = 
    (isimmutable(s) ? StaticArrays.mutable_similar_type : 
        StaticArrays.default_similar_type)(eltype(v), 
         Size(s), StaticArrays.length_val(s))(v) 

julia> u = @MArray [1u"g",2u"g",3u"g"]; 

julia> s = @SArray [1u"g",2u"g",3u"g"]; 

julia> static_similar(u,u./oneunit(t)) 
3-element SVector{3,Quantity{Float64, Dimensions:{ ^-1}, Units:{g s^-1}}}: 
1.0 g s^-1 
2.0 g s^-1 
3.0 g s^-1 

julia> static_similar(s,s./oneunit(t)) 
3-element MVector{3,Quantity{Float64, Dimensions:{ ^-1}, Units:{g s^-1}}}: 
1.0 g s^-1 
2.0 g s^-1 
3.0 g s^-1 

関連の機能はStaticArrays/src/abstractarray.jlで定義されています。特に注釈のコメント:https://github.com/JuliaArrays/StaticArrays.jl/blob/715fefe58bef7ef1d9b2e693d3468d4fd585e11f/src/abstractarray.jl#L60-L62

+0

関数 'static_similar'はおそらく@inline/@pureとし、2つの関数に分割して最適化を最もうまく機能させるべきです –

関連する問題