2016-05-03 7 views
1

の指定した割合は、さんがAA 7列の行列の4列目は、次の図にMatlabの:挿入またはそれだけで倍

[61 52 67 58 62 69 51 57 66 68 67 55 69 54 57 64 53 etc....]' 

MAIN QUESTIONが含まれていることを言ってみましょう表示されるようにベクターに特定の値を削除:ですランダムな場所に指定された値(例えば68)を挿入することができますが、この数値が挿入される回数を制御できるようにして、列全体の文脈において指定された割合のパーセンテージだけが現れるようにします。これは、元の列にあった値が削除される前に、新たに挿入された値が削除の対象となるようなものでしょうか? (したがって、与えられた例では、列4の値の30%を '68'にしたい場合、私が探しているコードは、この場合に必要な追加の68を追加します。68の30%の出現の上にすでに存在して開始するために、それは、これを行うためにする必要があるとして、コードではなく、ランダムに)など、多くの行を削除しますインスタンス

2番目の質問:

私は挿入しないとき列4(ここでは '68')に追加された値を使用して新しい行を追加すると、追加された各行の他の6つの列の値が必要になります。これらの列に他の値を追加するにはどうすればよいですか?関連する値は後で表示されますが、明らかに空の値を持つ行列を行列に追加することはできません...?

+0

これらの詳細の多くは実際には問題には関係ありません。できるだけ簡素化し、入出力の例を挙げてください。数字ではなく文字を使用して説明する方が簡単かもしれません。 '[casfsxxxdxgdsgxx]'、 'x'は興味のあるものです。 –

+0

@ dan-man - 質問を編集しました。うまくいきましたか?ありがとう:) –

+0

@excaza - それはクールだと 'ダミーレベルのためのプログラミング'で説明していると私はできると思いますか?ありがとう:) –

答えて

2

追加/削除する必要がある値の数を見つけることはかなり簡単です。

例:ベクトルAが与えられた場合、の値をAに追加して、希望の割合(DP)が30%になるようにします。だから、この式で始まる:

start

そして追加する値の数について解く:

finish

あなた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?

+0

素晴らしい - ありがとう!私は外出していますが、私はこれを後で見ていきます。とても有難い! –

関連する問題