2012-11-18 54 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

相关问题