Finding index of vector from its original matrix

后端 未结 2 456
刺人心
刺人心 2021-01-27 11:52

I have a matrix of 2d lets assume the values of the matrix

a =
    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    1         


        
2条回答
  •  一生所求
    2021-01-27 12:20

    You can use ismember with the 'rows' option. For example:

    tf = ismember(a, c, 'rows')
    

    Should produce:

    tf =
         0
         0
         1
         0
         0
         1
    

    To get the indices of the rows, you can apply find on the result of ismember (note that it's redundant if you're planning to use this vector for matrix indexing). Here find(tf) return the vector [3; 6].

    If you want to know the number of the row in matrix a that matches a single vector, you either use the method explained and apply find, or use the second output parameter of ismember. For example:

    [tf, loc] = ismember(a, [10 12 19 21 3], 'rows')
    

    returns loc = 4 for your example. Note that here a is the second parameter, so that the output variable loc would hold a meaningful result.

    Handling floating-point numbers

    If your data contains floating point numbers, The ismember approach is going to fail because floating-point comparisons are inaccurate. Here's a shorter variant of Amro's solution:

    x = reshape(c', size(c, 2), 1, []);
    tf = any(all(abs(bsxfun(@minus, a', x)) < eps), 3)';
    

    Essentially this is a one-liner, but I've split it into two commands for clarity:

    • x is the target rows to be searched, concatenated along the third dimension.
    • bsxfun subtracts each row in turn from all rows of a, and the magnitude of the result is compared to some small threshold value (e.g eps). If all elements in a row fall below it, mark this row as "1".

提交回复
热议问题