2017-10-16 130 views
2

我需要生成下面将解释的矩阵。如何有效地从矩阵中的每个重复行获取最小值和最大值?如何高效地从矩阵中的每个重复行获取最小值和最大值

让说,我有以下数据作为矩阵:

A = 

    x  y  z 

    -250 -60 -60 
    -250 -60 -59 
    -250 -60 -58 
    -250 -60  58 
    -250 -60  59 
    -250 -60  60 
    -250 -59 -60 
    -250 -59 -59 
    -250 -59 -58 
    .  .  . 
    .  .  . 
    .  .  . 
    -250  59  58 
    -250  59  59 
    -250  59  60 
    -250  60  58 
    -250  60  59 
    -250  60  60 

通过重复行,我的意思是x和y的值相同的多个行。现在我想的z的最小值和最大值从每一个重复的值,这样我就可以产生以下矩阵

 x  y  z 


    -250 -60  abs(min(z) - max(z)) % for all x = -250 and y = -60 
    -250 -59  abs(min(z) - max(z)) % for all x = -250 and y = -59 

我怎样才能有效地生成此矩阵?

+2

该示例不是3D矩阵。 – OmG

+0

请说明您的意思是3D矩阵还是3列矩阵。你的例子与你的问题和引言的标题相矛盾(在编辑之前)。 – rayryeng

+0

对不起,它只是一个3列矩阵。 – MaheshKumar

回答

5

这是使用accumarray加上unique的经典案例。这种方法带来的额外好处是,即使答案是解决问题的同样好的方法,您也不仅限于R2015b或更高版本。

使用unique可同时查找xy列的所有唯一行。您需要第一个输出找到这些唯一行,第三个输出为每行分配一个唯一的整数ID,从而为您提供该行所属的组。然后,您可以使用accumarray以及自定义映射函数,该函数可以找出属于同一组的最大值与最小值之间的差异。

[Au, ~, ID] = unique(A(:,1:2), 'rows'); 
out = accumarray(ID, A(:,3), [], @(z) abs(min(z) - max(z))); 
out = [Au out]; 

第一行代码使用前两列A查找所有唯一行。第一个输出Au仅给出了前两列中A中唯一行的矩阵。第三个输出为前两列的每一行分配一个整数ID。这提供了一个映射,以便将相同的行分配给相同的组。我们最后使用accumarray,我们使用提供分组的ID,并使用第三列,以便第三列中映射到相同ID的所有值,我们将某些值应用于该值集合。在我们的例子中,我们应用您的自定义函数abs(min(z) - max(z)),其中z是一个数组,它将属于相同ID的所有第三列值分组。

我们最终连接矩阵的唯一行与输出accumarray使我们显示您的预期输出。鉴于你相当有限的例子中,我们得到以下输出在MATLAB:

>> out 

out = 

    -250 -60 120 
    -250 -59  2 
    -250 59  2 
    -250 60  2 

我们可以验证这工作,因为映射到x = -250, y = -60,该组的最小值和最大值是-6060,所以之间的绝对差值这些元素是120。对于其余的独特行可以进行类似的过程。

+0

感谢您的明确答案。我已经更新了我的问题,能否告诉我我犯了什么错误。 – MaheshKumar

+1

对不起,我现在明白了为什么不起作用。也就是说,无论提取哪些列都填充在Au矩阵的前两列中,并且第三列将列出矩阵。由于我绘制这些数据,我不得不交换轴来绘制正确的数据。 – MaheshKumar

+0

@MaheshKumar,这是正确的。恭喜你弄明白了! – rayryeng

3

如果您正在使用R2015b或更高,使用findgroupssplitapply

[G, IDx, IDy] = findgroups(A(:, 1), A(:, 2)); 
Range = splitapply(@(z) abs(min(z) - max(z)), A(:, 3), G); 

NewMatrix = [IDx, IDy, Range]; 

findgroups做到了这一点,它发现有输入唯一组合的所有组。它返回一个带有组号的向量,它可以选择返回每个组的唯一值(上面的IDxIDy)。

splitapply然后将任何函数应用于每个组中的值。因此,该函数将应用于“组1”中的所有内容,然后是“组2”等,类似于cellfun将相同的函数应用于单元阵列中的每个元素。

+0

感谢您的帮助,但不幸的是,我只是有matlab R2011b。 – MaheshKumar

相关问题