問題タブ [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 - matlab - Accumarray隣接行列の混乱?
そのため、隣接行列を作成しようとしていますが、 と の違いについて混乱していaccumarray(matrix+1,1)
ますaccumarray(matrix,1)
。
やった:
その後:
「matrix+1」では余分な行とゼロの列があることは知っていますが、なぜそのようにするのか理解できません。調べたところ、この投稿によると、「matrix + 1」を使用する必要があり、そのために得た最良の説明は、「matlab のインデックス作成は 1 から始まるため」というものでした。
まったくわかりません...隣接行列を作成しようとした場合、どの方法が正しいですか? どんな助けでも大歓迎です、ありがとう!
arrays - accumarray にテーブルを出力させる
accumarray
2 行のインデックスを使用して、指定された関数によって割り当てられた値を持つ有効なインデックス ペアの位置に要素を持つ行列を作成します。たとえば、次のようになります。
この方法datamatrix
は20x20
、値を持つマトリックスになります。A
ただし、との値B
が非常に大きい場合、ほとんどが空の行列になり、端の隅に小さなデータのバッチができます。これを回避するには、次のように設定accumarray
しissparse
ます。
min(A)
これにより、非常に大きい場合や非常に大きい場合に、多くのメモリが節約されますmin(B)
。
しかし、私の問題は、最初の 2 列のインデックスに基づいて列 3 から 7 の平均を収集し、3 番目の列に基づいて 3 番目の列の標準偏差を収集したいのMx7
行列があることです。M~1e8
これを次のように構造化されたテーブルに保存したいと思います[X Y Z std R G B I]
。 ここで、X
とY
はインデックス、Z
はそのピクセルの平均高さ、 、 はR
ピクセルG
あたりの平均値 (色と強度)、B
は高さの標準偏差 (つまり、粗さ)。を使用して得られた行列を変換するため、この場合に を使用しても役に立ちません。I
std
issparse
accumarray
repmat
このコードのポイントは、点群から土地の高さ、粗さ、色、強度を推定することです。X と Y の座標を丸めてグリッドを作成し、グリッド セルごとにこれらの平均値が必要になりましたが、「テーブル」として出力します (MATLAB データ型ではなく、既定のマトリックス出力ではない 2D 配列)。
したがって、質問を締めくくるには:
accumarray
中間の(潜在的に非常に大きな)マトリックスなしでこのテーブルを出力する方法または同様の関数はありますか?
以下のコード:
ここの 9 列目は、セルあたりのポイント数です。
したがって、同じ X、Y (例:[19 36]
または[21 37]
) 上のすべてのポイントが平均化され (高さ、RGB、強度の順で)、3 番目の列の値の標準偏差も求められます。
残りのデータについても同様です。
コードを最新バージョンに更新しました。これにより、関数がグリッドを一度に作成するのではなく、次々に作成するようになったため、メモリのオーバーヘッドが大幅に削減されました。ただし、コードは並行して実行されているため、まだ 8 つの同時グリッドが作成されているため、解決策があれば幸いです。
matlab - accumarray MATLAB を使用する場合のコードの改善 / for ループの削除
入力行列が大きいため、データセット (「DATA」) からパーセンタイルを計算するのが非常に遅い次のコードがあります (「データ」は約 500.000 の長さで、「インデックス」から割り当てられた 10080 個の一意の値があります)。 .
このコードをより効率的にする可能性/提案はありますか? たとえば、どうにかして for ループを省略できますか?
arrays - Matlab Accumarray for 3D matrix
I really wish the documentation was more clear on the use of accumarray for N-D size matrices in Matlab. Regardless, I'm totally confused here and looking for some advice. Here's the challenge:
I have a 3D matrix of data.
- ROWS are individual rivers
- COLUMNS are dates of observations
- PAGES are the time intervals of data collection
For this example, let's assume each observation is volume of water flowing through the meter in a 5 minute interval. However, I now wish to resample the data to intervals of N minutes (obviously multiples of 5). Let's choose NMINS = 15.
So, what I want to do is find the sum or mean of the volume of water over NMINS minute intervals. That is, the ROWS and COLUMNS will not change, but the dimensions and values for the PAGES will be decimated/aggregated.
I can get the grouping values for the pages. That is, the values I need to group by. If it was a single river for a single day, no problem. But, I have hundreds of days and dozens of rivers.
I've gotten this far:
CREATE TEST TIME VECTOR
CREATE RANDOM MATRIX FOR TESTING
FIND TIMES IN TERMS OF MINUTES
NOW FIND ALL TIMES THAT CORRESPOND TO OUR BUCKET
RESET THE GROUPING INDICES
ADDITION: The group size will not be consistent and I cannot make that assumption (sadly). Consider the following after running the above.
Output shows first group is a size of 1:
Last, ultimately, I'll need to pass custom functions. The above is a toy example to illustrate the problem quickly. My apologies for not being more clear.
END ADDITION
And this is where I stumble...
How do I set the subs values to apply along each page to use accumarray? I'm totally confused by the documentation. Or is this actually the wrong approach? For what it's worth I'm using Matlab 2015b.
Honestly, any help would be greatly appreciated.
ALTERNATE SOLUTION This hit me on the way home. Meshgrid is my friend...
Once the cells above have been run (note I changed the size of the matrix X), we create the indices for the entire matrix where the "indices" for the pages (i.e., times) are given by the values in "subs". To do this, I use meshgrid.
Probably not the most memory efficient as I have to create essentially the days, rivers, and pages matrices, then wind up creating a new grpvals array of those. But, it has the advantage that now I can use accumarray and pass anonymous functions, @std, etc.
Hope this helps others!
Huge thanks to Luis.
arrays - 間隔を使用したベクトル内の要素の合計
vect = [1 2 3 4 5 6 7 8 9]
という名前のベクトルと という名前の別のベクトルがあるとしましょうintervals = [1 3 6 9]
。vest
を使用して、の要素の部分和の別のベクトルを取得することは可能intervals
ですか? 私はこのようなことをしたい:
部分和 1 = 1 + 2 + 3 ( からvect(1)
までの要素vect(3)
)
部分和 2 = 4 + 5 + 6 ( からvect(3 + 1)
までの要素vect(6)
)
部分和 3 = 7 + 8 + 9 ( からvect(6 + 1)
までの要素vect(9)
)
だから私がやりたいのは、最初の要素の合計を取得してから、前の合計にない最初の要素から始まるk
別の要素の合計などを取得することです.k
元の問題:n
元の問題は次のようなものでした:値と値を
持つベクトルを受け取りますk
。t = max(v) / k
インターバルを取りましょう。さて、n
間隔 [0, t) には からの値がいくつありますか? [t, t * 2) はどうでしょうか? [2 * t, 3 * t) はどうでしょうか? 等々。これまでは、accumarray(v, 1)
それぞれの値の数を見つけてint = (0:max(v)/k:max(v))
、間隔ベクトルを作成していましたが、今ではsum(accumarray(v, 1))
部分和を取得する必要があります。
これを使用してテストしたい場合 ( http://pastebin.com/jCZ3qYhz : で生成accumarray
) とk = 16
、部分和は次のようにする必要があります: 157, 167, 136, 251, 726, 1300, 1152.. for/while ループなしでこれを実行できるようにするには:) ベクトル化が鍵です!
編集:
最初の合計を取得するには、これを使用します: sum(accumarray(v, 1)(1:16))
、2番目の合計には: を使用しますsum(accumarray(v, 1)(17:32))
が、この操作をベクトル化する方法がわかりません。私はこれを試しました:i = (1:16:500)
。しかしsum(accumarray(v, 1)(i(1:length(i)) : i(2:length(i)))
、実際には機能していないか、正しいものを使用していません。
matlab - 時間雨量データからの累積和計算 MATLAB
1970 年から 2003 年までの 1 時間ごとの降水量の時系列があります。計算したいのは次のとおりです。
n 時間値、n = 2、3、6、12、24 & 48 時間。24 時間雨量データは、1 時間データを 24 回連続して累積することで計算できます。同様に、48 時間の降雨量は、2 日間の降雨量を加算することで計算できます。
n 時間の時系列から、各年の最大降雨量を計算したいと思います。
同様に、他の累積期間についても計算できます。ただし、年間n時間雨量情報の最大値から算出できるn時間データ(集計時系列)からの年間最大雨量値の算出方法についてご提案が必要です。たとえば、1970 年から 2003 年まで、2、...24 時間に対応する 34 の年間最大値と、48 時間に対応する 19 の年間最大値を抽出したいと考えています。ここでサンプル データセットを見つけてください。
https://docs.google.com/document/d/1e8g54c6KDw8lwdQ53xi0Bs9fJmasTqbIk2n4LbKA-gM/edit
最初、2 番目、3 番目、4 番目の列は、それぞれ年、月、日、および値を示します。
私はこのコードを試しました:
コードを編集しました。問題は次のとおりです。行列 ny_p では、実行中に以前の年の値も格納されます。行列 Ann_Max で各年の最大 n 時間値の配列を取得したいと考えています。