Matlab:如何以20%百分比或30%或50%M更改二进制值[0 1]的矩阵

时间:2014-11-10 09:53:27

标签: matlab

使用matlab,我喜欢用二进制值[0 1]用百分比改变我的矩阵:

示例:

矩阵= [0 1 0 1 0 1 1 1 1 1            1 1 1 1 1 0 0 0 0 0            1 1 1 0 0 0 1 1 1 0]

如何以20%百分比或30%或x%百分比更改此矩阵。

谢谢。

2 个答案:

答案 0 :(得分:1)

这可以使用randperm - 函数来查找索引并对这些索引应用not() - 函数,以便将True更改为False,反之亦然。如果x是矩阵的百分比,应该更改,代码可能如下所示:

Matrix = [ 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0];

% //find number and indices of matrix elements to change
x = 0.2; % relative percentage 
n = round(numel(Matrix)*x); % // num of elements to change
idx = randperm(numel(Matrix));
idx = idx(1:n); % // take the first n random indices

% // apply the change on elements
Matrix(idx) = not(Matrix(idx)); % // 0->1, 1->0 at indices idx

为了了解会发生什么,这里有一个示例,其中x=0.2我们需要更改矩阵的n=6元素

% Explanation in an example
idx % // [22    16    30    18     6    10]
Matrix_original(idx) % // [1     0     0     0     1     1]
Matrix(idx) % // [0     1     1     1     0     0]

因此对于这6个索引,所有的索引现在为零,而现在全部为零。

答案 1 :(得分:0)

matr= zeros(10);
ratio= 20;
No_of_ones=round(numel(matr)/100*ratio);
No_of_zeros=numel(matr)-No_of_ones;
helper=[ones(No_of_ones,1);zeros(No_of_zeros,1)];
new_order= randperm(numel(matr));
new_matr=helper(new_order);
matr= reshape(new_matr,size(matr,1),size(matr,2));

matr:是矩阵(在这种情况下是10x10)
比率:是百分比的比率。
然后我计算零和一的数量。我构造了一个1-dim数组,其中包含1和0的确切数字(如果比率不是元素数量的除法,则舍入1)在将它们与randperm一起随机排列之前。
最后但并非最不重要的是,我将它们重塑为所需的输出(10x10)。