在MATLAB中保留非支配元素而忽略其余元素的最快方法是什么?

在MATLAB中保留非支配元素而忽略其余元素的最快方法是什么?,matlab,Matlab,例如,[2,5]支配着[3,8]原因(2

例如,
[2,5]
支配着
[3,8]
原因(2<3)和(5<8)

但是
[2,5]
并不支配
[3,1]
虽然(2<3)但是(5>1),所以这两个向量是非支配的

例如,假设我有这样一个矩阵:

a =[ 1 8;
    2 6;
    3 5;
    4 6];
这里前三个是非支配的,但最后一个是由(3,5)支配的,我需要一个可以忽略它的代码,并给我这个输出:

ans =

    [ 1 8;
    2 6;
    3 5]
请注意,Nx2矩阵中可能有许多非支配元素

  • 使用以下命令将一行与其他行进行比较:
  • 使用cell2mat对每一行(或循环,如果您愿意)执行此操作,并将输出转换回矩阵
  • 使用和检查占主导地位的行
  • 删除这些行
  • 代码:


    编辑 如果您想使用
    =
    而不是
    比较,则每一行都将占主导地位并将被删除,因此您将得到一个空矩阵。通过如下调整代码过滤掉这些误报:

    a=[1 8;2 6;3 5;4 6];
    N = size(a,1);
    
    compare_matrix = cell2mat(arrayfun(@(ii) all(bsxfun(@(x,y) x>=y,a,a(ii,:)),2),1:N,'uni',false));
    compare_matrix(1:N+1:N^2)=false; % set diagonal to false
    dominated_idxs = any(compare_matrix,2);
    
    a(dominated_idxs ,:) = [];
    
  • 使用以下命令将一行与其他行进行比较:
  • 使用cell2mat对每一行(或循环,如果您愿意)执行此操作,并将输出转换回矩阵
  • 使用和检查占主导地位的行
  • 删除这些行
  • 代码:


    编辑 如果您想使用
    =
    而不是
    比较,则每一行都将占主导地位并将被删除,因此您将得到一个空矩阵。通过如下调整代码过滤掉这些误报:

    a=[1 8;2 6;3 5;4 6];
    N = size(a,1);
    
    compare_matrix = cell2mat(arrayfun(@(ii) all(bsxfun(@(x,y) x>=y,a,a(ii,:)),2),1:N,'uni',false));
    compare_matrix(1:N+1:N^2)=false; % set diagonal to false
    dominated_idxs = any(compare_matrix,2);
    
    a(dominated_idxs ,:) = [];
    

    这个问题与识别所谓的“帕累托前沿”是相同的

    如果元素N的数量越来越大,并且/或者您需要经常执行此类操作(我怀疑您会这样做),那么您可能需要考虑使用一种方法来实现此目的(可在Mathworks文件交换上获得):

    编译此文件,将mex放在Matlab路径中,然后使用

    a = a(paretofront(a));
    

    将比任何Matlab内置组合能够更快地完成任务

    这个问题与识别所谓的帕累托前沿相同

    如果元素N的数量越来越大,并且/或者您需要经常执行此类操作(我怀疑您会这样做),那么您可能需要考虑使用一种方法来实现此目的(可在Mathworks文件交换上获得):

    编译此文件,将mex放在Matlab路径中,然后使用

    a = a(paretofront(a));
    

    将比任何Matlab内置组合能够更快地完成任务

    谢谢你的帮助。。。。如果我把(自己测试一下,它应该可以工作。实际上,你可以在bsxfun调用中放入任何函数,对两行进行向量比较并返回相同大小的逻辑向量。我试图修改它,但它没有按照我想要的方式工作,,,我给出[3,4;3,5],我想要[3,5]被移除,但它不会t@MohamadPishdad当前位置我知道发生了什么:如果你感谢你的帮助,每一行都占主导地位……如果我把(自己测试一下,应该可以。实际上,你可以在bsxfun调用中放入任何函数,对两行进行向量比较,并返回相同大小的逻辑向量。我试图修改它,但它没有按我想要的方式工作,,,我给出[3,4;3,5],我想要[3,5]被移除,但它不会t@MohamadPishdad当前位置我知道发生了什么:如果使用