Matlab:在向量中插入或删除特定值,使其仅显示指定的百分比

时间:2016-05-03 19:34:42

标签: matlab

让我们说7列矩阵的第4列包含以下数字

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

主要问题:是否有一种方法可以在随机位置插入指定值(例如68),但能够控制插入此数字的次数,以便它只显示指定的百分比次数整个专栏的背景。这样,在删除原始列中的任何值之前,新插入的值会被删除吗? (因此,在给定的示例中,如果我们希望第4列中30%的值为' 68'那么我要寻找的代码将为此添加尽可能多的额外68是这样的(或者在开始时已经有超过30%出现68的情况下,代码将随机删除所需的行数以便执行此操作)。

第二个问题:

当我通过第4列中添加的值(此处为' 68')插入新行时,我将需要每个添加行的其他6列的值 - 我如何确保这些列中还添加了一些其他值吗?我稍后会用相关值替换它们,但显然它不会让我在矩阵中添加任何空值......?

1 个答案:

答案 0 :(得分:2)

查找需要添加/删除的值的数量非常简单。

例如:给定向量A,您希望将n_new值添加到A,以获得30%的所需百分比DP。所以你从这个等式开始:

start

并求解要添加的值的数量:

finish

获得n_new值后,您就知道需要向阵列添加多少次val。你可以在A(或两者)的任何一端抛出一些,然后对结果数组进行排序。您可以利用randperm生成一个随机的索引向量,并使用它们随机创建"排序"阵列。另请参阅:MATLAB' Matrix Indexing documentation,特别是accessing multiple elements

删除值使用几乎相同的逻辑。如果您的n_new值为负数,则表示您需要删除n_new次出现的val才能获得DP

在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的整数数据类型,我还会添加必要的警告,以便比较两个浮点数是否相等。在find调用中,您需要为浮点问题考虑容差。有关详细信息,请参阅:What Every Computer Scientist Should Know About Floating-Point Arithmetic以及更具体的MATLAB Why is 24.0000 not equal to 24.0000 in MATLAB?