追加/削除する必要がある値の数を見つけることはかなり簡単です。
例:ベクトルAが与えられた場合、の値をA
に追加して、希望の割合(DP
)が30%になるようにします。だから、この式で始まる:
そして追加する値の数について解く:
あなたn_new
値を取得したら、あなたはあなたval
のどのように多くの発生を知っていますあなたの配列に追加する必要があります。 A
(またはその両方)の両端にいくつかをスローし、結果の配列をソートすることができます。 randperm
を利用して、インデックスのランダム化ベクトルを生成し、ランダムに「ソート」された配列を作成するのに使用できます。 MATLABのMatrix Indexing documentation、特にaccessing multiple elementsも参照してください。
値を削除すると、ほぼ同じロジックが使用されます。 n_new
の値が負の場合は、DP
を取得するためにオカレンスを削除する必要があります(val
)。MATLABで
これは私たちに次のようなもの与えます:
% Sample Vector
A = [61 52 67 58 62 69 51 57 66 68 67 55 69 54 57 64 53];
% Criteria
DP = 0.4;
val = 57;
% Find count of val in A
n_val = length(find(A==val)); % Ignore floating point issues for brevity
% Find number of new values to add/remove to get to DP
n_new = (n_val - DP*length(A))/(DP - 1);
n_new = fix(n_new); % Need to round to the nearest integer in some direction
if n_new > 0
% Need to add values
% Create new vector, append appropriate number of values
B = horzcat(A, repmat(val, 1, n_new));
% Randomly sort
newidx = randperm(length(B)); % Generate a random permutation of our indices
B = B(newidx);
elseif n_new < 0;
B = A; % Copy vector
% Need to remove values
val_idx = find(B == val); % Ignore floating point issues for brevity
remidx = val_idx(randperm(length(val_idx), abs(n_new))); % Generate n_new number of random indices
B(remidx) = []; % Delete values
end
% Test
p = length(find(B==val))/length(B);
私たちに次のようになります:
B =
57 51 52 57 57 69 57 57 55 67 53 57 64 69 57 57 54 57 61 58 57 66 67 68 62
p =
0.4000
とテスト除去に:
% Sample Vector
A = [57 51 52 57 57 69 57 57 55 67 53 57 64 69 57 57 54 57 61 58 57 66 67 68 62];
% Criteria
DP = 0.10;
val = 57;
をそして、我々が得ます:
B =
57 51 52 69 57 55 67 53 64 69 54 61 58 66 67 68 62
p =
0.1176
MATLABの整数データ型で作業していない場合は、2つの浮動小数点を比較するための義務的な警告も追加します。 find
の呼び出しでは、浮動小数点の問題に対処するための許容範囲を組み込むことが望ましいでしょう。詳細については、What Every Computer Scientist Should Know About Floating-Point Arithmeticを参照してください。さらにMATLAB固有のWhy is 24.0000 not equal to 24.0000 in MATLAB?
これらの詳細の多くは実際には問題には関係ありません。できるだけ簡素化し、入出力の例を挙げてください。数字ではなく文字を使用して説明する方が簡単かもしれません。 '[casfsxxxdxgdsgxx]'、 'x'は興味のあるものです。 –
@ dan-man - 質問を編集しました。うまくいきましたか?ありがとう:) –
@excaza - それはクールだと 'ダミーレベルのためのプログラミング'で説明していると私はできると思いますか?ありがとう:) –