Matlab 如何在一组分组变量中找到最后一个元素?
我有一个150x2矩阵,其中第一列包含可被视为“分组变量”的数字,第二列包含与这些分组变量相关的值。所以一个小的12x2版本看起来像这样Matlab 如何在一组分组变量中找到最后一个元素?,matlab,Matlab,我有一个150x2矩阵,其中第一列包含可被视为“分组变量”的数字,第二列包含与这些分组变量相关的值。所以一个小的12x2版本看起来像这样 200741 5441 200741 5524 200741 5428 200742 5670 200742 5668 200742 5559 200742 5215 200743 5184 200743 5473 200743 5496 200743 5568 200743 5702 我想找到与每个分组变量关联的值的最后一个值。因此
200741 5441
200741 5524
200741 5428
200742 5670
200742 5668
200742 5559
200742 5215
200743 5184
200743 5473
200743 5496
200743 5568
200743 5702
我想找到与每个分组变量关联的值的最后一个值。因此,上面的示例将生成最后一个元素5428(对于变量200741),最后一个元素5215(对于变量200742)和最后一个元素5702(对于分组变量200743)。在coumn1中找到分组变量的唯一值后,如何获取第2列中与每个分组变量对应的最后一个元素?在Matlab中如何实现这一点?这可能是一种方法,假设
A
作为输入数组-
%// Sort the input matrix based on the column -1 values,
%// just for cases when the "grouping variables" are not already sorted
A = sortrows(A,1)
%// Use diff to find out the row indices where "groups" switch
%// to give us the last row indices for each "grouping", which
%// could be used to index into second column of A for final output
out = A([diff(A(:,1))~=0 ; true],2)
假设矩阵按分组数排序,如示例所示,要获得布尔索引,可以执行以下操作: 假设您的矩阵是
a
I=a(1:end-1, 1) ~= a(2:end, 1)
它将布尔数存储在与最后一个“分组”数相对应的索引上,最后一个除外。
因此,要获得所需的行,只需执行a(I,:)
。别忘了最后的结果。
或者,作为一个班轮:
[a( a(1:end-1, 1) ~= a(2:end, 1), : ); a(end, :)]
您可以使用
unique
为您提供数字第一次或最后一次出现的位置;根据版本的不同,您可能需要使用legacy
选项以确保它返回last
索引:
[B,ind,~] = unique(A(:,1),'last','legacy');
out = A(ind,2);
如果第一列已排序且包含正整数,则可以使用(无可否认地稍微拉伸):
注:
- 分类要求源于这样一个事实,即根据
如果
中的下标未根据其线性索引进行排序,则subs
在传递给accumarray
时可能不会始终保持val中数据的顺序 因此,fun
并不总是给出最后一个元素@(x)x(end)
- 如果分组值较大(如示例所示),则使用稀疏版本的accumarray(第五个参数
)true
bsxfun
?;)我得到的印象是OP将从第一列中提取唯一的
值,无论如何,也可以选择两个。@nkjt将accumarray
做什么?:-)@Divakar键为@(x)x(end)
(连同引用的备注):从每组中选取最后一个元素。但是,是的,我强迫了一些事情。你们给我留下了很好的答案!:-)嗯,现在有点道理了!您可能应该指出,这假设矩阵是按照第一个排序的column@LuisMendo完成了,虽然没有谈论“最后”的值,如果没有排序。例如,考虑<代码> [ 10;1;10;2;20;5;10 4 ] < /代码>。最后的值是4
(对于10
)和5
(对于20
)。矩阵并不奇怪——这里发布的任何解决方案对你有用吗?
result = nonzeros(accumarray(A(:,1), A(:,2), [], @(x) x(end), 0, true));