减少样本矩阵的长度,保持相同的比例

时间:2015-06-12 11:54:03

标签: matlab

我有一个值为Phi_Values的向量和一个矩阵Phi_occurences,其中包含Phi_Values的每个值的出现次数,以及每个depht的出现次数(每行代表一个深度)< / p>

作为一个例子(不是真正的尺寸和价值,真的太大了,不能粘贴在这里

Phi_values =

0.2000    0.3000    0.4000    0.5000    0.6000

Phi_occurences =

    2000        3000          20        1980        3000
    1000        2000        3000        4000           0
    4000           0        1000        3000        2000

所以在这个例子中,对于深度1,有2000次出现0.2次,3000次出现0.3次,20次出现0.4次,......

对于每个深度,累计发生10000次。 由于某些原因,我需要获得400次累积发生但保持相同的比例作为例子,如果我有20%的发生次数是Phi_values(1),我想保留转化后的那些20%

我所做的是将Phi_Occurrences除以25(10 000/25 = 400),然后应用round

Phi_occurences = round(Phi_occurences/25)

但是随后每个深度的累积出现次数不再是400,但是由于该回合,或多或少 400,当我需要400时..

我想了一会儿,我无法弄清楚如何在保持比例与原始比例尽可能接近的情况下获得精确的出现次数

TL; DR :我需要将正整数矩阵(有10 000行的总和)除以25,将结果放在整数中,这样我得到一个总和精确到400,线比例尽可能接近原始矩阵。

编辑:例如,如果

Phi_occurences(1) =

2506        2507        2506        2481

然后

Phi_occurences(1)/25 = 

100.2400  100.2800  100.2400   99.2400

sum(Phi_occurences(1)/25) =

400

sum(round(Phi_occurences(1)/25)) =

399

1 个答案:

答案 0 :(得分:1)

那么,在这些情况下,您可以检查最高余数并将该数字加1以使其为400.您的示例,

clc
clear

a =  [2506 2507 2506 2481];

a = a./25;

b = round(a);

if sum(b) ~= 400
   [~, m] = max(rem(a, b));

   b(m) = b(m) + 1;
end

sum(b)

fprintf('\t\ta\tb\n');
disp([a' b']);

给出,

ans =

   400

        a   b
  100.2400  100.0000
  100.2800  101.0000
  100.2400  100.0000
   99.2400   99.0000