我假设您的Ids 是正整数,并且您的Dates 是 numbers。
如果您想要每个 Id 的最大日期,这将是accumarray
使用该max
函数的完美案例。在下文中,我将使用f
来表示传递给accumarray
.
您想要最大值索引的事实使它有点棘手(而且更有趣!)。问题是与给定 ID 对应的日期被传递给f
没有对其原始索引的任何引用。因此,一个f
基于max
不能帮助。但是您可以使索引“通过”accumarray
作为日期的虚部。
所以:如果您只想要每个 Id 的一个最大化索引(即使有多个):
result = accumarray(t.Id,... %// col vector of Id's
t.Date+1j*(1:size(t,1)).', ... %'// col vector of Dates (real) and indices (imag)
[], ... %// default size for output
@(x) imag(x(find(real(x)==max(real(x))),1))); %// function f
请注意,f
这里的函数最大化实部,然后提取包含原始索引的虚部。
或者,如果您想要每个 Id 的所有最大化索引:
result = accumarray(t.Id,... %// col vector of Id's
t.Date+1j*(1:size(t,1)).', ... %'// col vector of Dates (real) and indices (imag)
[], ... %// default size for output
@(x) {imag(x(find(real(x)==max(real(x)))))}); %// function f
如果您的Id 是字符串:使用 的第三个输出将它们转换为数字标签unique
,然后按上述方式进行操作:
[~, ~, NumId] = unique(t.Id);
然后要么
result = accumarray(NumId,... %// col vector of Id's
t.Date+1j*(1:size(t,1)).', ... %'// col vector of Dates (real) and indices (imag)
[], ... %// default size for output
@(x) imag(x(find(real(x)==max(real(x))),1))); % function f
或者
result = accumarray(NumId,... %// col vector of Id's
t.Date+1j*(1:size(t,1)).', ... %'// col vector of Dates (real) and indices (imag)
[], ... %// default size for output
@(x) {imag(x(find(real(x)==max(real(x)))))}); %// function f