我有两个向量
data vector: A = [1 2 2 1 2 6; 2 3 2 3 3 5]
label vector: B = [1 2 1 2 3 NaN]
我想取具有相同标签的所有列的平均值,并将它们输出为按标签号排序的矩阵,忽略 NaN。所以,在这个例子中我想要:
labelmean(A,B) = [1.5 1.5 2; 2 3 3]
这可以通过像这样的 for 循环来完成。
function out = labelmean(data,label)
out=[];
for i=unique(label)
if isnan(i); continue; end
out = [out, mean(data(:,label==i),2)];
end
但是,我正在处理包含许多数据点和标签的巨大数组。此外,此代码片段将经常执行。我想知道是否有一种更有效的方法可以做到这一点,而无需循环遍历每个单独的标签。
这是一种方法:
- 获取不包含的标签索引
NaN
s.
- 创建一个由 0 和 1 组成的稀疏矩阵,乘以
A
将给出所需的行总和。
- 将该矩阵除以每列的总和,使总和变为平均值。
- 应用矩阵乘法得到结果,并转换为满矩阵。
Code:
I = find(~isnan(B)); % step 1
t = sparse(I, B(I), 1, size(A,2), max(B(I))); % step 2
t = bsxfun(@rdivide, t, sum(t,1)); % step 3
result = full(A*t); % step 4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)