我试图在矩阵的一列中找到唯一值,该列受到相同矩阵的第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,:);
答案 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