我有 72x3双,看起来像这样
1 1 24
1 1 125
2 3 17
6 2 54
5 1 110
4 4 55
6 2 200
1 4 16
3 3 87
...
6 2 63
我希望能够根据第1列和第2列的值组合找到第3列中的值。例如,让我们调用第1列 m 中的任何值,列中的值2 n ,第3列的相应值 n 。如果 m = 2 , n = 3 ,这将对应 3 行,因此 p 将 17 即可。如果 m = 5 , n = 1 ,这将给我们第5行,因此 b 将 110 。请注意,在某些情况下,一组 m 和 n 会为我们提供两行或更多行。一个例子是 m = 1 和 n1 = 1 ,它应该从第一行产生 24 而 125 从第二排。在这种情况下,输出应为 [24 125] 。同样,组合 m = 6 和 n = 2 会给出 [54 200 63] 。 m 范围从1到6, n 范围从1到4. m 和 n 的任何组合都会产生不超过4个输出。任何人都可以帮我解决这个索引问题吗?
非常感谢你。
亚历
答案 0 :(得分:4)
假设A
为输入N x 3
数组的一种方法 -
%// Find unique rows using the first two columns of A
[unqA12,~,idx] = unique(A(:,1:2),'rows')
%// Group elements from 3rd column of A based on the indexing pairs from
%// first coloumns of A and have these as a cell array
A3vals = accumarray(idx,A(:,3),[],@(x) {x})
%// Horizontally concatenate these results to present the final output
out = [num2cell(unqA12) A3vals]
对给定输入运行样本会将输出生成为 -
out =
[1] [1] [2x1 double]
[1] [4] [ 16]
[2] [3] [ 17]
[3] [3] [ 87]
[4] [4] [ 55]
[5] [1] [ 110]
[6] [2] [3x1 double]
或arrayfun
-
%// Find unique rows using the first two columns of A
[unqA12,~,idx] = unique(A(:,1:2),'rows')
%// Use arrayfun to do the groupings instead of accumarray this time
out = [num2cell(unqA12) arrayfun(@(n) A(idx==n,3),1:max(idx),'Uni',0).']
请注意,第一种方法不会保留第三列元素的顺序,但第二种方法会这样做。
答案 1 :(得分:3)
这不是最快的方式,但对于像我这样的初学者来说是另一种方法:)
in = [1 1 24;
1 1 125;
2 3 17;
6 2 54;
5 1 110;
4 4 55;
6 2 200;
1 4 16;
3 3 87];
m = input('Enter m ');
n = input('Enter n ');
Idx = all((cat(2,in(:,1) == m, in(:,2) == n)),2);
out = in(:,3);
out1 = out(Idx);
结果:
Enter m 6
Enter n 2
ans =
54
200
----------------
Enter m 2
Enter n 3
ans =
17
答案 2 :(得分:1)
如果您只想获得m
和n
的给定组合的结果,则可以仅使用索引:
m = 6;
n = 2;
result = x(x(:,1)==m & x(:,2)==n, 3).';