Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何在一组分组变量中找到最后一个元素?_Matlab - Fatal编程技术网

Matlab 如何在一组分组变量中找到最后一个元素?

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 我想找到与每个分组变量关联的值的最后一个值。因此

我有一个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中找到分组变量的唯一值后,如何获取第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
    在传递给
    fun
    时可能不会始终保持val中数据的顺序

    因此,
    @(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));