【问题标题】:Does Mathematica have a function equivalent to Matlab's "unique" functionMathematica 有没有相当于 Matlab 的“独特”功能的功能
【发布时间】:2010-02-04 22:31:18
【问题描述】:

是否有一个 Mathematica 函数可以提供与 MATLAB 中的 unique() 函数等效的结果?我意识到我可以使用Union[] 函数来获取列表的唯一元素,但我想要与函数的三结果版本等效的东西,该函数提供在输入数组和唯一值数组之间映射的索引数组.

如果没有内置任何东西,是否有该功能的实现在某处可用?这里有人知道如何构建它吗?

【问题讨论】:

    标签: matlab wolfram-mathematica


    【解决方案1】:

    您可以使用 Mathematica 的 Position[] 轻松构建类似的功能。例如。给定一个数字列表,您可以执行以下操作:

    In[1] := A = {1, 5, 2, 3, 7, 3, 2, 8, 6, 5, 9, 2, 1};
    In[2] := {#, Flatten[Position[A, #]]} & /@ Union[A]
    Out[2]:= {{1, {1, 13}}, {2, {3, 7, 12}}, {3, {4, 6}}, {5, {2, 10}}, {6, {9}}, {7, {5}}, {8, {8}}, {9, {11}}}
    

    获取唯一元素的列表以及它们在原始列表中出现的位置的索引。 准确复制 Matlab 的 Unique() 的功能,特别是对于

    [b,m,n] = unique(A)
    

    你需要

    b = Union[A];
    m = Last[Position[A, #]] & /@ b // Flatten;
    n = Position[b, #] & /@ A // Flatten;
    

    现在提供所需的行为

    In[1] := A[[#]] & /@ m == b
    Out[1]:= True
    
    In[2] := b[[#]] & /@ n == A
    Out[2]:= True
    

    【讨论】:

    • 这正是我想要的。我已经忘记了所有关于 Position[] 的内容,并且在浏览文档时没有再次找到它。感谢您的帮助!
    • 要考虑的一点是Union 将对输入列表进行排序。如果您不希望这种情况发生,请使用DeleteDuplicatesDeleteDuplicates 对于大输入也往往更快。
    • 感谢您的提示,我必须进行一些测试,但这可能对我的项目来说是一个很好的改进。
    【解决方案2】:

    试试Length[Union[x]]If x=[1,0,1,1,1],然后你会得到Length[Union[x]] = 2

    【讨论】:

      【解决方案3】:

      有一个简单的方法:

      a={1,2,3,4,5,5,5,4,3,2}
      
        {1,2,3,4,5,5,5,4,3,2}
      
      uniques = DeleteDuplicates[a]
      
        {1,2,3,4,5}
      

      【讨论】:

        猜你喜欢
        • 2013-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-18
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多