2017-11-22 8 views
1

配列をパーセンテージでセグメントに分割したい。たとえば、100個の要素を[1/3,1/4,5/12]のセグメントに分割します(ただし、[1/3,1/4,5/12]*100=[33.3,25,41.7])。[33,25,42][34,24,42][33,26,41]のようなものも受け入れられます.1以内での放浪は重要ではありません)。アレイを細分する方法は?

現在、私は再帰的に

function x = segment(n,pct) 
x = n * pct; 
y = fix(x); 
r = x - y; 
for ii = 1 : length(r)-1 
    [r(ii),r(ii+1)] = deal(fix(r(ii)),r(ii+1)+r(ii)-fix(r(ii)));  
end 
x = y + r; 

segment(100,[1/3,1/4,5/12])[33,25,42]を与え、これを行うためにループを使用します。

再帰的ループなしで良い方法がありますか?

+0

は 'ラウンド(N * PCT)です'何を探しているの..? – Adiel

+0

@Adielいいえ、 'sum(round(n * pct))'は 'n 'であることが保証されていません – Lee

+0

ああ、私は得ます。だから、私はこの数値を計算するだけです。もし100-nを得るなら、nに近い要素をインクリメントします。 '100 + n 'のデクリメントと同じです...それは合うでしょうか? – Adiel

答えて

2

あなたはそれを修正する必要がある場合にのみ、ほとんどの場合のためのAdielさんのコメントを使用し、直後に任意の不正な結果をキャッチし、それを修正することができます。

function out = segmt(n , pct) 

% This works by itself in many cases 
out = round(n.*pct) ; 

% for the other cases: 
% if the total is not equal to the initial number of point, the 
% difference will be affected to the largest value (to minimize the 
% percentage imbalance). 
delta = sum(out) - n ; 
if delta ~= 0 
    [~,idx] = max(out) ; 
    out(idx) = out(idx) - delta ; 
end 
+0

追加コメント:ここに入力チェックはありません。この例では、入力で与えられたパーセンテージの合計が100%になると仮定しています。おそらく、関数の開始時にチェック条件を追加し、入力が間違っていればエラーまたは警告を返すべきです。 – Hoki

+0

「パーセントの不均衡を最小限に抑える」というコメントを除いて、より速い実装です。もっと不均衡になる可能性があります。 – Lee

関連する問題