找到受约束条件限制的唯一值 - Matlab

时间:2015-03-05 01:26:49

标签: matlab

我试图在矩阵的一列中找到唯一值,该列受到相同矩阵的第2列中列出的最大量的限制。

我的代码如下:

    Testing = find(unique(RAW_DATA_2(:,1))&max(RAW_DATA_2(:,2)))

对我而言,它会读取矩阵第1列中的唯一项目,这也是第2列的最大值。然而,Matlab不同意我的观点。

另一种方法是甚至不使用find函数,只返回一个矩阵,其中只包含每个唯一值的唯一值和最大值,这将是更好的选择。我试图使用我在堆栈溢出时找到的一些代码来执行此操作,但由于我无法将其从“第一个”修改为“唯一”,因此我遇到了问题。

 I = true(size(RAW_DATA_2,1),1);
 idx = [];
 while any(I)
     idx(end+1) = find(I,1,'first');  %#ok
     I = I & all(~bsxfun(@eq, RAW_DATA_2, RAW_DATA_2(idx(end),:)),2);
 end

 result = RAW_DATA_2(idx,:);

3 个答案:

答案 0 :(得分:2)

我认为你的澄清评论使问题更容易理解。您应该考虑将其添加到问题本身。这里有一些可以帮助你的代码

a = [0 10; 1 100; 3 175; 4 80; 1 200; 2 400; 3 150; 0 10]; % your raw data
asorted = unique(a, 'rows');  %returns unique rows, sorted by value

请注意,asorted不包含任何重复的行,并按以下方式排序:

asorted =
 0    10
 1   100
 1   200
 2   150
 2   300
 2   400
 3   150
 3   175
 4    80

现在很清楚,包含第1列的每个唯一元素的最下面一行是我们需要的。这可以通过以下方式实现:

diffidx = [diff(asorted(:, 1)); 1];  % appending 1 because the last row 
                                     % must always be included
result = asort(diffidx~=0, :)

答案 1 :(得分:1)

这样可行,但如果你有很多独特日期,可能会有点过分。

m = max( bsxfun(@times, A(:,2), bsxfun(@eq,unique(A(:,1))',A(:,1)) ));
answer = [unique(A(:,1)), m']

作为4个日期的示例,1,2,3,4

 2    65
 2    16
 3    94
 4    25
 3    63
 4    26
 3    50
 4    82
 1    92
 3    16
 1    49
 1   100
 2    62
 1    44
 3    34

我的输出如下,"日期"在左边和右边的相应最大值。

 1   100
 2    65
 3    94
 4    82

答案 2 :(得分:1)

基于accumarray的解决方案似乎也非常适合 -

%// Find unique elements from column-1 and also tag/ID each of its elements
[col1_unq,~,id] = unique(RAW_DATA_2(:,1),'stable');

%// Get the max from second column based on the IDs and then concatenate
%// with unique rows from column-1 for the final output
result = [col1_unq accumarray(id,RAW_DATA_2(:,2),[],@max)]

示例运行 -

RAW_DATA_2 =
   12.5000    5.0000
   12.5000    2.5000
    5.0000   12.5000
   10.0000   10.0000
    7.5000    7.5000
    7.5000   10.0000
   12.5000    7.5000
    5.0000   10.0000
result =
   12.5000    7.5000
    5.0000   12.5000
   10.0000   10.0000
    7.5000   10.0000