問題タブ [accumarray]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matlab - `accumarray` はその関数引数に対して異常な呼び出しを行います
短縮版:
の 4 番目の引数として渡された関数は、 の最初の引数をエンコードした仕様と一致しないaccumarray
引数で呼び出されることがあります。accumarray
その結果、 への引数として使用される関数accumarray
は、事実上何が異常な状態であるかをテストする必要があります。
問題は、このような異常な状態を 1 式の無名関数でどのようにテストできるかということです。accumarray
そしてより一般的に:の文書化されていない動作に対して堅牢な無名関数をどのように書くことができますか?
完全版:
以下のコードは、今日の私の勤務時間のほとんどを占めていた問題を大幅に要約したものです。
最初のいくつかの定義:
Notevals1
は、要素 2 と 8 を交換することによって取得さvals0
れます。「匿名」関数anon
は、その入力の非無限要素の中で最大値を計算します。
これらの定義を考えると、以下の 2 つの呼び出し
2 番目の引数 ( vals0
vs ) のみが異なる場合、とvals1
の違いはへの呼び出しの 1 つに対する引数の値の順序にのみ影響し、この関数の結果はの順序に影響されないため、同じ結果が生成されます。その引数の要素。vals0
vals1
anon
結局のところ、これら 2 つの式の最初の式は正常に評価され、正しい結果1が生成されます。
ただし、2 つ目は次のように失敗します。
この問題をトラブルシューティングするために、私が思いつくことができたのは、別の関数を作成することだけでした (もちろん、「MATLAB の方法で」独自のファイルに)
...そして以下を実行しました:
上記の最後の呼び出しの出力からわかるaccumarray
ように、コールバックへの 2 番目の呼び出しの引数kluge
は array でした[Int]
。accumarray
これは、文書化されている3のように動作していないことを疑う余地なく教えてくれます(idxs
長さ 1 の配列がaccumarray
の関数引数に渡されないように指定されているため)。
実際、このテストや他のテストから、予想に反して、渡された関数が(= 3) 回accumarray
以上呼び出されていることがわかりました。max(idxs)
上記を含む式では、kluge
5回呼び出されます。
ここでの問題は、 の関数引数が実際に呼び出される方法に依存できない場合accumarray
、この関数引数を堅牢にする唯一の方法は、必要なチェックを実行するために多くの追加コードを含めることです。これにはほぼ確実に、関数に複数のステートメントが必要になるため、無名関数は除外されます。(たとえば、kluge
上記の関数は よりも堅牢ですanon
が、匿名関数に適合する方法がわかりません。) で匿名関数を使用できないとaccumarray
、その有用性が大幅に低下します。
だから私の質問は:
への強力な引数となる無名関数を指定する方法は?
accumarray
1この投稿に示されているすべての MATLAB 出力で、MATLAB の典型的なオーバー パディングから空白行を削除しました。
2その他のトラブルシューティングに関する提案があれば、コメントを歓迎します。この問題のトラブルシューティングは、本来よりもはるかに困難でした。
3特に、 「関数は次のように入力を処理します:」
という行の直後の項目番号 1 から 5 を参照してください。
arrays - 多重度の配列をすばやく取得する方法
配列を取得して[つまり、 の一意の配列要素のセット] と、 inの i 番目のエントリの i 番目の多重度を i 番目の場所に取る多重度配列のA
両方を出力する最速の方法は何ですか。unique(A)
A
unique(A)
A
それは一口なので、ここに例があります。を考えるとA=[1 1 3 1 4 5 3]
、私は欲しい:
unique(A)=[1 3 4 5]
mult = [3 2 1 1]
これは面倒な for ループで実行できますが、MATLAB の配列の性質を活用する方法があるかどうか知りたいです。
matlab - Accumarray 各ビンの最後の obs のみを使用するように "fun" を設定する方法
accumarray
各グループの最後以外のすべての観測を削除する方法はありますか?
私が念頭に置いていたのは、似たようなものでした:
例を挙げると、次のようなものがあるとします。
私が実際に考えているのはaccumarray
、それを使用して各ビンの観測値の平均を計算したからです。したがって、トリックを作成できるすべての機能は、私にとっては問題ありません。
matlab - matlab の並べ替えられていないデータの accumarray 出力の拡張
accumarray 関数を使用して、ベクトル「id」で定義されたカテゴリ内のベクトル「データ」の値を合計しています。ベクター ID が必ずしもソートされているわけではなく、連続していない番号が含まれている可能性もあります。また、(unique(id) と同じサイズではなく) id と同じサイズの合計 Sij のベクトルを取得したいと考えています。
例えば
私が望む出力として
データセットを作成し、結合関数を使用して (次のコードを使用して) 何とかそれを行うことができましたが、より効率的な方法があるかどうか疑問に思っていました (これは私が最大化している可能性関数の一部であり、速度を上げたいと考えています) )。ありがとう!
matlab - MATLAB で NaN を無視しながら累積された行の値から平均計算
次の問題をエレガントに解決する方法についての提案を探しています。私の特定のケースではパフォーマンスは問題ではありませんが、良い慣行に関するコメントをいただければ幸いです。
前もって感謝します!
短いバージョン:
NaN 値を無視しながら、いくつかのロジックに従って行列の行を平均化しようとしています。私が現在持っているコードは、NaN 値を希望どおりに処理しません。
長いバージョン:
私のデータは次の方法で構築されています。
- 「ビン」の 1 つの (最初の) 列。各ビンの行数は一定ではありません。ビンは整数である必要はありません。行は事前にソートされています。
- おそらく NaN を含む可変数のデータ列。
次に例を示します。
望ましい結果は、最初の列に一意の「ビン」を含む行列であり、残りは「NaN によって損なわれていない」ことを意味します。たとえば、次のようになります。
- 特定の列 + ビンに NaN しかない場合 (上記の例では、最初のデータ列 + ビン 210)、結果は NaN になります。
- 特定の列とビンに NaN と数値が混在している場合、結果は有効な数値の平均になります。上記の例: 1 番目のデータ列 + ビン 200 が与える必要があります
(0.720+0.706+0.693)/3=0.7063
-- この列 + ビンの 3 (4 ではなく) による除算に注意してください。
上記の例の望ましい結果は次のとおりです。
私がこれまでに試したこと:
これは、いくつかのソースからコンパイルできたコードです。NaNまたは数値のみを含む列+ビンでうまく機能しています。
これが私が現在得ているものです:
ps
- 万が一、スプレッドシート ソフトウェア (MS Excel など) を使用したほうが簡単な場合は、アイデアをお待ちしております。
- 列ごとに計算を行うことは、これを処理する方法に関する私の現在の考えです。完全なマトリックスをすぐに取得するために一般化する方法があるかどうか疑問に思っていました。