私は32gのRAMを搭載した64ビットのmatlabを使用しています(ご存知のとおり)。
130 万個の数値 (整数) のファイル (ベクトル) があります。同じ長さの別のベクトルを作成したいのですが、各ポイントは最初のベクトル全体の加重平均であり、その位置からの逆距離で加重されています(実際には、^-1ではなく位置^-0.1ですが、例として) . 現在のポイントより前のものしか平均化できないため、matlab の「フィルター」関数を使用できません。より明確に説明するために、3 つの要素の例を次に示します。
data = [ 2 6 9 ]
weights = [ 1 1/2 1/3; 1/2 1 1/2; 1/3 1/2 1 ]
results=data*weights= [ 8 11.5 12.666 ]
i.e.
8 = 2*1 + 6*1/2 + 9*1/3
11.5 = 2*1/2 + 6*1 + 9*1/2
12.666 = 2*1/3 + 6*1/2 + 9*1
したがって、新しいベクトルの各ポイントは、最初のベクトル全体の加重平均であり、1/(その位置からの距離 + 1) で加重されます。
各ポイントの重みベクトルを作り直して、要素ごとに結果ベクトルを計算することもできますが、これには for ループの 130 万回の反復が必要で、それぞれに 130 万回の乗算が含まれます。1x1.3mil を 1.3milx1.3mil で乗算する単純な行列乗算を使用したいと思いますが、これは理論的には機能しますが、それほど大きな行列をロードすることはできません。
次に、シェル スクリプトを使用してマトリックスを作成し、matlab でインデックスを作成しようとしています。これにより、マトリックスの関連する列のみが一度に呼び出されますが、これにも非常に長い時間がかかります。
私はこれをmatlabで行う必要はないので、このような多数の数値を利用して平均を取得することについて人々が持っているアドバイスをいただければ幸いです。^-1 ではなく ^-0.1 の重みを使用しているため、それほど速くは落ちません。元のポイントの重み付け 1 と比較して、100 万番目のポイントはまだ 0.25 に重み付けされているため、単純にカットすることはできません。大きくなったらオフ。
これが十分に明確だったことを願っていますか?
以下の回答のコードは次のとおりです(書式設定できますか?):
data = load('/Users/mmanary/Documents/test/insertion.txt');
data=data.';
total=length(data);
x=1:total;
datapad=[zeros(1,total) data];
weights = ([(total+1):-1:2 1:total]).^(-.4);
weights = weights/sum(weights);
Fdata = fft(datapad);
Fweights = fft(weights);
Fresults = Fdata .* Fweights;
results = ifft(Fresults);
results = results(1:total);
plot(x,results)