Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 根据现有值随机替换矩阵中元素的百分比_Matlab_Random_Replace_Element - Fatal编程技术网

Matlab 根据现有值随机替换矩阵中元素的百分比

Matlab 根据现有值随机替换矩阵中元素的百分比,matlab,random,replace,element,Matlab,Random,Replace,Element,是否有合理的方法将矩阵/向量中每个值的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;

是否有合理的方法将矩阵/向量中每个值的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];  

尝试使用逻辑阵列和生成的随机数,如下所示:

vals_to_change=rand(size(A,1),size(A,2))<p;
A(vals_to_change)=rand(sum(vals_to_change),1);
vals_to_change=rand(大小(A,1),大小(A,2))使用来自的信息,我能够实现我的目标。下面的代码将用新值替换矩阵中每个值的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);

谢谢你的回复。如果我运行上面的代码,使用p=0.10,结果(vals_to_change)从没有值为1的元素变为值为1的5个元素(n=10),有时在同一行中。上面的第二行代码导致错误消息“未定义函数'RND'用于'double'类型的输入参数”。我不认为help RND在matlab中没有任何功能。我已经阅读了binornd的文档,并修改了您粘贴的代码的变体,但我不确定代码应该做什么。请告知。谢谢。试试我最新的零钱。抱歉,有时我会稍微混淆编程语言…上面的代码使用矩阵A会导致以下错误:“矩形空矩阵的赋值不正确”和“矩形空矩阵的赋值不正确”。请告知。我使用的是MATLAB 2011b。你的意思是,如果你改变一行上的每一个值,你就要改变它吗?@Pearsonartphoto不,我只想改变一个或多个元素,而不是整行。元素的数量将取决于百分比x。因此,您希望以固定百分比的方式逐行随机更改数字吗?也就是说,如果数字是20%,您将始终更改每行的1个元素?@pearsonatphoto Right。随机部分是该行中哪些元素被更改。因此,20%意味着5x5中每行的一个元素(如a)应更改为新值。但是,如果要更改的百分比为4%,则整个5x5中只有一个元素将更改为新值。再次感谢您的帮助。@Pearsonartphoto我想,一旦您提供给我的代码可以运行,我就可以让每个值的评估工作正常。事实上,正如你所说,我认为这也可能更好。谢谢