我尝试将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];
寻找一个脚本。谢谢!
答案 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保存排序中的索引 - 因此您可以根据原始数据创建矩阵。然后是之前的片段。