让我们说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列的值 - 我如何确保这些列中还添加了一些其他值吗?我稍后会用相关值替换它们,但显然它不会让我在矩阵中添加任何空值......?
答案 0 :(得分:2)
查找需要添加/删除的值的数量非常简单。
例如:给定向量A,您希望将n_new
值添加到A
,以获得30%的所需百分比DP
。所以你从这个等式开始:
并求解要添加的值的数量:
获得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?