【问题标题】:Using the unique function without sorting the values and getting those rows使用 unique 函数而不对值进行排序并获取这些行
【发布时间】:2016-06-15 07:33:00
【问题描述】:

我试图根据在第三列中找到的唯一值获取所有行,而不是对它们进行排序。请参见下面的示例。 我将保留的行的索引将是第 1、2、3、5、7 行(按此顺序) 我正在考虑使用unique([5 5 3 4],'stable')('stable' 选项似乎保持索引值顺序而不进行排序),但我使用的Octave 4.0 没有 stable 选项如何解决这个问题?

示例数组:

C=[
1, 103.4025175681402,    103.4104224840438,    0.007904915903608867;
2, 102.1231938014567,    102.1146017352405,    0.00859206621620956;
3, 97.5338137548381,    97.53996181901071,    0.006148064172606382;
4, 97.54468038366592, 97.53996181901071,    0.004718564655206592;
5, 93.76199482417094,    93.77030145885571,    0.008306634684771552;
6, 93.77539643924416,    93.77030145885571,    0.005094980388449244;
7, 106.976493571217,    106.9837463671074,    0.007252795890309471]

我想要得到的最终数组

D=
[
1, 103.4025175681402,    103.4104224840438,    0.007904915903608867;
2, 102.1231938014567,    102.1146017352405,    0.00859206621620956;
3, 97.5338137548381,    97.53996181901071,    0.006148064172606382;
5, 93.76199482417094,    93.77030145885571,    0.008306634684771552;
7, 106.976493571217,    106.9837463671074,    0.007252795890309471];

Code: I used thanks Brocodile to gives me the index `1,2,4,6,7` I'm trying to get the index `1,2,3,5,7`

C=[1, 103.4025175681402,    103.4104224840438,    0.007904915903608867;
2, 102.1231938014567,    102.1146017352405,    0.00859206621620956;
3, 97.5338137548381,    97.53996181901071,    0.006148064172606382;
4, 97.54468038366592, 97.53996181901071,    0.004718564655206592;
5, 93.76199482417094,    93.77030145885571,    0.008306634684771552;
6, 93.77539643924416,    93.77030145885571,    0.005094980388449244;
7, 106.976493571217,    106.9837463671074,    0.007252795890309471]

[~,i,~] = unique(C(:,3));
D = C(sort(i),:);

输出是:

 1       103.40251756814      103.410422484044   0.00790491590360887
 2      102.123193801457       102.11460173524   0.00859206621620956
 4      97.5446803836659      97.5399618190107   0.00471856465520659
 6      93.7753964392442      93.7703014588557   0.00509498038844924
 7      106.976493571217      106.983746367107   0.00725279589030947

请注意,这只是一个示例,会有数百行。 PS:我在 ubuntu 64bit 16.04 上使用 octave 4.0 谢谢

【问题讨论】:

    标签: matlab octave


    【解决方案1】:

    您还可以使用unique 通过将其分配给多个变量来获取唯一性的索引。

    [D,id,ic] = unique(C);
    

    id 这里为我们提供了保存在D 中的唯一值的索引C。 如果您只想检查第二列是否有唯一值,则只能使用unique(C(:,2)) 检查第二列。 您现在想要的是 C 中唯一行(按第 2 列)的索引;我们可以通过[~,i,~] = unique(C(:,2), "first") 获取它们。在你的例子中,这会给我们:

        i = 
            5
            3
            2
            1
            7
    

    现在我们只需要sort(i) 以正确的顺序获取索引,然后将唯一的行复制到 D:

    D = C(i,:)
    

    长话短说: 您可以像这样解决缺少'stable' 的问题:

    [~,i,~] = unique(C(:,2), "first");
    D = C(sort(i),:);
    

    【讨论】:

    • 这样做会给我索引1,2,4,6,7 而不是1,2,3,5,7 我会用我使用的代码更新问题
    • 我只使用 matlab,但从文档中我认为它是通过在八度音程中使用 [~,i,~] = unique(C(:,2), "first"); 来修复的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2022-01-05
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    相关资源
    最近更新 更多