如何在Matlab中进行矩阵操作?

4
我有一个大小为m x n的矩阵A和另一个大小为1 x n的矩阵b(在Matlab中)。
矩阵b由一系列1、一系列2、一系列3等组成,直到某个值k为止。
(例如b = [1 1 1 2 2 2 3 4 4],n = 9)
我想要对于A中的每一行,在每个段中选择最大值,并将该子序列中的其他元素清零。
因此,例如,对于一行A = [0 -1 2 3 4 1 3 4 5],我会得到
[0 0 2 0 4 0 3 0 5]
如果A中有多行(m>1),则应对每行进行此操作。
我可以使用for循环轻松完成它,但速度很慢,因为我同时循环了m和n。
是否有“一行代码”可以在Matlab中完成它,或者有什么简单的方法可以快速实现?
1个回答

3

如果 A 是单行,可以使用一个临时函数,accumarray 可以完成这项工作:

result = accumarray(b(:), A(:) ,[] , @(x) {x==max(x)});
result = vertcat(result{:}).' .* A;

由于使用了单元格,无法确定速度有多快。

如果 A 有多行,您可以使用循环遍历这些行。


+1 哇!我不知道 accumarray 可以使用自定义函数。很棒的代码高尔夫。 - Sanjay Manohar
@SanjayManohar 谢谢!不仅需要自定义函数;函数输出可以是单元数组!非常灵活。 - Luis Mendo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接