給定如下的位域(數字只能是 1 或 0):
const bits = [1, 1, 0, 1, 0, 0, 0, 1]
我想生成一個 N 平均值串列,其中 N 是任意數字。
在我們上面的示例中,假設 N 為 4,結果將是[1, 0.5, 0, 0.5]。(將陣列 2 按 2 分組,然后計算每組的平均數)。
相反,如果 N 為 2,則結果為[0.75, 0.25]。
到目前為止,我一直在使用以下代碼:
const average = (...args) => args.reduce((a, b) => a b) / args.length;
const averageNumbers = Ramda.splitEvery(Math.floor(bits.length / N), bits).map(nums => average(nums))
問題是如果我的陣列由 696 個值組成并且我需要 150 個平均數字,則上述方法不起作用bits,因為我最終有 174 個數字而不是 150 個。
我究竟做錯了什么?
uj5u.com熱心網友回復:
如評論中所述,您最終得到 174 個數字而不是 150,因為floor(696 / 150)將位欄位劃分為 174 個 4 位塊。
要獲得平均值的近似值,您可以先將位欄位“擴展”為 N 的倍數,然后再取平均值。
// Factor is the lowest number to expand bits by for its length to be a multiple of N
const factor = lcm(bits.length, N) / bits.length;
// Expand bits by the factor
const expandedBits = bits.map(bit => Array(factor).fill(bit)).flat(1);
const averages = splitEvery(Math.floor(expandedBits.length / N), expandedBits).map(nums => average(...nums));
// averages.length should now always be N
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/451723.html
標籤:javascript 数学
上一篇:如何在Sagemath中評估帶有三角函式和復數的運算式?
下一篇:多項式插值中的誤差定義
