2012-11-18 55 views
0

是否有一種明智的方法可以用一個新值替換矩陣/向量中每個值的x%,並且隨機選擇要更改的元素?也就是說,在A中,如果我想將值的20%(每個現有值爲1個元素)更改爲值5,如何確保A中每個現有值的5個元素中的每一個都具有等同於改變新值(例如5)的概率?我將不勝感激關於完成上述任務的方法的一些指導。隨機用每個現有值替換矩陣中元素的百分比

謝謝。

% Example Matrix 
% M = 5; 
% N = 5; 
% A = zeros(M, N); 
A = [0 0 0 0 0; 
    1 1 1 1 1; 
    2 2 2 2 2; 
    3 3 3 3 3; 
    4 4 4 4 4]; 

% Example Matrix with 20% of elements per value replaced with the value '5' 
A = [0 0 5 0 0; 
    1 5 1 1 1; 
    2 5 2 2 2; 
    3 3 3 3 5; 
    4 4 5 4 4]; 
+0

是否意味着如果您根本改變它,您想要更改行上的每個值? – PearsonArtPhoto

+0

@Pearsonartphoto不,我只是想改變一個或多個元素而不是整行。元素的數量將取決於_x_的百分比。 – nofunsally

+0

所以你想要以固定百分比的方式逐行更改數字,隨機? IE,如果這個數字是20%,你總是會改變每一行的1個元素? – PearsonArtPhoto

回答

0

使用信息,從herehere我能夠實現我的目標。下面的代碼將用一個新值替換矩陣中每個值的x%,然後在矩陣中隨機化它的位置。

M = 5; 
N = 5; 
A = zeros(M, N); 
PC = 20; % percent to change 
nCells = round(100/PC); % # of cells to replace with new value 
A = [0 0 0 0 0; 
    1 1 1 1 1; 
    2 2 2 2 2; 
    3 3 3 3 3; 
    4 4 4 4 4]; 
A2 = A+1; % Pad the cell values for calculations (bc of zero) 
newvalue = 6; 
a=hist(A2(:),5);% determine qty of each value 
for i=1:5 
    % find 1st instance of each value and convert to newvalue 
    A2(find(A2==i,round(a(i)/nCells)))=newvalue; 
end; 
out = A2-1; % remove padding 
[~,idx] = sort(rand(M,N),2); % convert column indices into linear indices 
idx = (idx-1)*M + ndgrid(1:M,1:N); %rearrange each newvalue to be random 
A = out; 
A(:) = A(idx); 
0

嘗試使用邏輯陣列和產生的隨機數,象這樣:

vals_to_change=rand(size(A,1),size(A,2))<p; 
A(vals_to_change)=rand(sum(vals_to_change),1); 
+0

感謝您的回覆。如果我運行上面的代碼,使用p = 0.10,結果(vals_to_change)從沒有值爲1的元素變爲(n = 10)到值爲1的5個元素,有時在同一行中。上述第二行代碼導致錯誤消息「未定義函數'RND',用於'double'類型的輸入參數。」我不認爲幫助rnd,在MATLAB中沒有任何東西。我已經閱讀了binornd的文檔,並修改了代碼的變體,但我不確定代碼應該做什麼。請指教。謝謝。 – nofunsally

+0

嘗試我最新的變化。很抱歉,偶爾我會混淆編程語言咯... – PearsonArtPhoto

+0

上面的代碼,使用矩陣_A_導致以下錯誤:「不正確的矩形空矩陣賦值。」和「矩陣空矩陣分配不當」。請指教。我正在使用MATLAB 2011b。 – nofunsally

相關問題