2017-11-22 1 views
1

Ich möchte ein Array in Segmente nach Prozenten aufteilen. Zum Beispiel teilen 100 Elemente in Segmente [1/3,1/4,5/12], aber [1/3,1/4,5/12]*100=[33.3,25,41.7], so dass es notwendig ist, sie auf ganze Zahlen [33,25,42] (andere wie [34,24,42] oder [33,26,41] sind auch akzeptabel, ein Wandern innerhalb 1 ist nicht wichtig) anzupassen.Wie unterteilt man ein Array?

Derzeit verwende ich eine Schleife dieses

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]) gibt [33,25,42] rekursiv zu tun.

Gibt es einen besseren Weg ohne rekursive Schleife?

+0

Ist 'Runde (n * pct)' Was suchen Sie..? – Adiel

+0

@Adiel Nein, 'sum (round (n * pct))' ist nicht garantiert, 'n' zu sein – Lee

+0

Oh, ich bekomme. Also würde ich einfach diese Zahl berechnen, und wenn ich '100-n' bekomme, würde ich die' n' Elemente erhöhen, die näher an ihrer Runde sind. Das gleiche für '100 + n' mit Dekrementen ... Würde das passen? – Adiel

Antwort

2

Sie können nur Kommentar Adiel die Nutzung für den meisten Fällen, und fangen nur irgendein Schurken Ergebnis nach und korrigieren, nur dann, wenn sie korrigiert werden muss:

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

nur ein zusätzlicher Kommentar: Es gibt hier keine Eingabeüberprüfung. In diesem Beispiel wird angenommen, dass die Summe der in der Eingabe angegebenen Prozentsätze 100% ergibt. Sie sollten wahrscheinlich zu Beginn der Funktion eine Prüfbedingung hinzufügen und einen Fehler oder eine Warnung ausgeben, wenn die Eingabe falsch ist. – Hoki

+0

Eine schnellere Implementierung, mit Ausnahme des Kommentars 'Minimiere das prozentuale Ungleichgewicht 'ist nicht immer wahr. Es könnte unausgeglichener sein. – Lee