将Matrix中的数据标准化为十进制

时间:2012-02-20 15:10:19

标签: matlab

我尝试将Matrix A的每一行的数据规范化为十分位数。

矩阵A看起来像:

[.01 .02 .03 .04 .05;
 1 2 3 4 5;
 1000 2000 3000 4000 5000];

如何将第一行标准化为十进制,然后第二行...直到最后一行?不使用'for / while'?

输出如下:

[2 3 6 8 10;
 2 3 6 8 10;
 2 3 6 8 10];

寻找一个脚本。谢谢!

4 个答案:

答案 0 :(得分:1)

您可以使用sortrows命令根据特定列对矩阵进行排序。从那里,如果n是矩阵的长度,只需为矩阵(1:n / 10,i)指定值1,为矩阵指定值2(n / 10 + 1:2 * n / 10)等(显然,如果n / 10不是整数,可以进行一些舍入。)

答案 1 :(得分:1)

您可以将HISTC与统计工具箱中的QUANTILE功能结合使用来生成边缘:

x = randn(20,1);
q = quantile(x,0:0.1:1);
[~,xqnorm] = histc(x,q);

编辑:HISTC不包含等于bin右边缘的值。因为这个max(x)不会分配给第10个bin,而是分配给额外的(第11个)bin。为了避免它,你可以稍微增加最大边缘(在histc调用之前插入这一行):

q(end) = q(end)+0.1;

答案 2 :(得分:1)

这应该会产生类似于您要求的内容(使用统计工具箱中的tiedrank):

f = @(x,i) tiedrank(x)*10/numel(x);
bsxfun(f,x',ones(1,3))'
不过要小心舍入和休息,你可能需要调整最后一行。

另外:见https://stackoverflow.com/questions/9296568/matlab-normalize-data-into-deciles

答案 3 :(得分:0)

我也不太确定。但我认为我有一些片段朝着正确的方向发展。

假设我们总是调用您的矩阵数据

 data  = rand(3,4)

使用

获得每行的最大值
 m_val = max(data,2)

您可以构建矩阵

 mat = diag( 10./ m_val )

如果你计算

 res = mat * data

它应该具有我所理解的属性。


也许是另一个有用的片段

 [a,b] = sort(vec)

b保存排序中的索引 - 因此您可以根据原始数据创建矩阵。然后是之前的片段。