使用预定规则索引矩阵

时间:2015-04-07 04:08:17

标签: matlab indexing

我有 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个输出。任何人都可以帮我解决这个索引问题吗?

非常感谢你。

亚历

3 个答案:

答案 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)

如果您只想获得mn的给定组合的结果,则可以仅使用索引:

m = 6;
n = 2;
result = x(x(:,1)==m & x(:,2)==n, 3).';