我有一个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
我想找到与每个分组变量关联的值的最后一个值。因此,上面的例子将产生5428的最后一个元素(对于变量200741),最后一个元素为5215(对于变量200742)& 5702的最后一个元素(用于分组变量200743)。在coumn1中找到分组变量的唯一值后,如何获取column2中与每个分组变量对应的最后一个元素?怎么可以在Matlab中完成?
答案 0 :(得分:4)
如果第一列已排序且包含正整数,则可以使用accumarray
(无可否认地延伸一点):
result = nonzeros(accumarray(A(:,1), A(:,2), [], @(x) x(end), 0, true));
注意:
排序要求源于这样一个事实:根据documentation,
如果
subs
中的下标没有根据其线性索引进行排序,那么accumarray
在将fun
传递给@(x) x(end)
时可能并不总是保留val中数据的顺序/ p>
所以accumarray
并不总是提供 last 元素。
true
(第五个参数{{1}})的稀疏版本。答案 1 :(得分:3)
这可能是一种方法,假设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)
答案 2 :(得分:3)
假设矩阵按分组编号排序,如示例所示,要获得布尔索引,您可以执行以下操作:
给定矩阵为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, :)]
答案 3 :(得分:3)
您可以使用unique
为您提供数字第一次或最后一次出现的位置;根据版本的不同,您可能需要使用legacy
选项以确保它返回last
索引:
[B,ind,~] = unique(A(:,1),'last','legacy');
out = A(ind,2);