例如,问题的简化版本:
A=
0 10 50
20 30 20
10 70 20
40 20 10我想为的每一列获得逻辑标签,该列的值在第一四分位数(L)、第二和第三四分位数(M)和第四四分位数(N)中排列。这样,最后我就可以得到这样的输出:
L=
1 1 0
0 0 0
0 0 0
0 0 1M=
0 0 0
1 1 1
1 0 1
0 1 0N=
0 0 1
0 0 0
0 1 0
1 0 0在这个4x3矩阵示例中,每个列都有4个值。第一四分位数(排名)表示值最低的四分位数,第二和第三四分位数为第二和第三最低值,第四四分位数为最高值。因此,在另一个例子中,如果一个列有40个值,那么我想为矩阵中的第一个四分位数标记最低的10个值,以此类推。
想象一下我有1000x1000矩阵..。“分位数”和“百分位数”函数不能做到这一点,因为它们不对每个单元格值进行排序。那么,我该怎么做才能做到这一点呢?
发布于 2014-11-06 09:25:11
这就是你要找的吗?:
pL = prctile(A,25,1);
pU = prctile(A,75,1);
L = bsxfun(@le, A, pL);
N = bsxfun(@ge, A, pU);
M = ones(size(A))-L-N;编辑:,如果存在NaNs,请将此用于M,而不是上面的内容:
M = ~isnan(A)-L-N;
发布于 2014-11-06 09:17:07
q = prctile(A, [25,75,100])
5 15 15
30 50 35
40 70 50我们可以使用bsxfun找到以下每一个点下面的所有数字:
B = bsxfun(@le, A, permute(q, [3,2,1]);现在,您需要将每个矩阵(沿第三维空间)与前一个矩阵的~ (即B(:,:,2) = B(:,:,2).*~B(:,:,1))累计相乘,这既可以用循环进行,也可以像这样将其矢量化:
N = cat(3, ones(size(B,1), size(B,2)), ~B(:,:,1:end-1))
B.*N返回:
ans(:,:,1) =
1 1 0
0 0 0
0 0 0
0 0 1
ans(:,:,2) =
0 0 0
1 1 1
1 0 1
0 1 0
ans(:,:,3) =
0 0 1
0 0 0
0 1 0
1 0 0如果要查找不同百分位数的索引,此方法非常容易扩展:
p = [25, 75, 100];
q = prctile(A, p);
B = bsxfun(@le, A, permute(q, [3,2,1]);
N = cat(3, ones(size(B,1), size(B,2)), ~B(:,:,1:end-1))
B.*N因此,例如,如果您想在五层中使用它,只需将p更改为[20 40 60 80 100]
https://stackoverflow.com/questions/26775253
复制相似问题