Arrays 创建一个递增向量,但考虑另一个向量中相等元素的出现次数
我有一个数组,看起来像这样:Arrays 创建一个递增向量,但考虑另一个向量中相等元素的出现次数,arrays,matlab,Arrays,Matlab,我有一个数组,看起来像这样: A = 5873 4 5873 7 5873 1 2819 8 2819 1 9771 4 9771 2 9771 5 9771 6 5548 7 B = 5873 4 1 5873 7 1 5873 1 1 2819 8 2 2819 1 2 9771 4 3 9771 2 3 9771 5 3 9771 6 3 5548 7 4 我想做的是创建一个新列,该列对唯一标识符(即第一列中的条目)在数组中出现的时间进行排序
A =
5873 4
5873 7
5873 1
2819 8
2819 1
9771 4
9771 2
9771 5
9771 6
5548 7
B =
5873 4 1
5873 7 1
5873 1 1
2819 8 2
2819 1 2
9771 4 3
9771 2 3
9771 5 3
9771 6 3
5548 7 4
我想做的是创建一个新列,该列对唯一标识符(即第一列中的条目)在数组中出现的时间进行排序。大概是这样的:
A =
5873 4
5873 7
5873 1
2819 8
2819 1
9771 4
9771 2
9771 5
9771 6
5548 7
B =
5873 4 1
5873 7 1
5873 1 1
2819 8 2
2819 1 2
9771 4 3
9771 2 3
9771 5 3
9771 6 3
5548 7 4
有人知道这样做的优雅方式吗?非常感谢 我认为Matlab没有内置函数来实现这一点,但您可以很容易地自己实现它:
B = [A zeros(size(A,1),1)]; %Preallocate memory
for i = 1:size(A,1)
B(i,3) = sum(A(:,1) == A(i,1)); %Count how many occurrences
end
这不是超高效的,因为它会执行大量冗余计算,但它会完成工作。另外,如果您开始使用非整数数据,请注意这一点:从2013b开始,Matlab表示0.1+0.1+0.1==0.3的语句是错误的(由于浮点的特殊性),因此上面的代码可能会给出一些神秘的结果 我认为Matlab没有内置函数来实现这一点,但您可以很容易地自己实现它:
B = [A zeros(size(A,1),1)]; %Preallocate memory
for i = 1:size(A,1)
B(i,3) = sum(A(:,1) == A(i,1)); %Count how many occurrences
end
这不是超高效的,因为它会执行大量冗余计算,但它会完成工作。另外,如果您开始使用非整数数据,请注意这一点:从2013b开始,Matlab表示0.1+0.1+0.1==0.3的语句是错误的(由于浮点的特殊性),因此上面的代码可能会给出一些神秘的结果 我认为Matlab没有内置函数来实现这一点,但您可以很容易地自己实现它:
B = [A zeros(size(A,1),1)]; %Preallocate memory
for i = 1:size(A,1)
B(i,3) = sum(A(:,1) == A(i,1)); %Count how many occurrences
end
这不是超高效的,因为它会执行大量冗余计算,但它会完成工作。另外,如果您开始使用非整数数据,请注意这一点:从2013b开始,Matlab表示0.1+0.1+0.1==0.3的语句是错误的(由于浮点的特殊性),因此上面的代码可能会给出一些神秘的结果 我认为Matlab没有内置函数来实现这一点,但您可以很容易地自己实现它:
B = [A zeros(size(A,1),1)]; %Preallocate memory
for i = 1:size(A,1)
B(i,3) = sum(A(:,1) == A(i,1)); %Count how many occurrences
end
这不是超高效的,因为它会执行大量冗余计算,但它会完成工作。另外,如果您开始使用非整数数据,请注意这一点:从2013b开始,Matlab表示0.1+0.1+0.1==0.3的语句是错误的(由于浮点的特殊性),因此上面的代码可能会给出一些神秘的结果 在稳定模式下使用的第三个输出:
[~,~,Y] = unique( A(:,1), 'stable')
B = [A Y]
给出:
B =
5873 4 1
5873 7 1
5873 1 1
2819 8 2
2819 1 2
9771 4 3
9771 2 3
9771 5 3
9771 6 3
5548 7 4
正如Luis Mendo所指出的,unique的'stable'
选项是在Matlab2013a中引入的。对于旧版本,我建议我的第一个想法是:
在稳定模式下使用第三个输出:
[~,~,Y] = unique( A(:,1), 'stable')
B = [A Y]
给出:
B =
5873 4 1
5873 7 1
5873 1 1
2819 8 2
2819 1 2
9771 4 3
9771 2 3
9771 5 3
9771 6 3
5548 7 4
正如Luis Mendo所指出的,unique的'stable'
选项是在Matlab2013a中引入的。对于旧版本,我建议我的第一个想法是:
在稳定模式下使用第三个输出:
[~,~,Y] = unique( A(:,1), 'stable')
B = [A Y]
给出:
B =
5873 4 1
5873 7 1
5873 1 1
2819 8 2
2819 1 2
9771 4 3
9771 2 3
9771 5 3
9771 6 3
5548 7 4
正如Luis Mendo所指出的,unique的'stable'
选项是在Matlab2013a中引入的。对于旧版本,我建议我的第一个想法是:
在稳定模式下使用第三个输出:
[~,~,Y] = unique( A(:,1), 'stable')
B = [A Y]
给出:
B =
5873 4 1
5873 7 1
5873 1 1
2819 8 2
2819 1 2
9771 4 3
9771 2 3
9771 5 3
9771 6 3
5548 7 4
正如Luis Mendo所指出的,unique的'stable'
选项是在Matlab2013a中引入的。对于旧版本,我建议我的第一个想法是:
这是一条路要走。但是,如果您的Matlab版本不够新,则该函数没有“稳定”选项。在这种情况下,您可以非常轻松地使用:
这项工作如下:
对于A
第一列中的每个条目,向量e
给出该值第一次出现的索引(的第二个输出给出最大化器的第一个位置)。在您的示例中,e
是:1,1,1,4,4,6,。。。然后,向量k
将该序列转换为连续的数字:1,1,1,2,2,3,。。。从这一点出发,结果就产生了。这是一条路要走。但是,如果您的Matlab版本不够新,则该函数没有“稳定”选项。在这种情况下,您可以非常轻松地使用:
这项工作如下:
对于A
第一列中的每个条目,向量e
给出该值第一次出现的索引(的第二个输出给出最大化器的第一个位置)。在您的示例中,e
是:1,1,1,4,4,6,。。。然后,向量k
将该序列转换为连续的数字:1,1,1,2,2,3,。。。从这一点出发,结果就产生了。这是一条路要走。但是,如果您的Matlab版本不够新,则该函数没有“稳定”选项。在这种情况下,您可以非常轻松地使用:
这项工作如下:
对于A
第一列中的每个条目,向量e
给出该值第一次出现的索引(的第二个输出给出最大化器的第一个位置)。在您的示例中,e
是:1,1,1,4,4,6,。。。然后,向量k
将该序列转换为连续的数字:1,1,1,2,2,3,。。。从这一点出发,结果就产生了。这是一条路要走。但是,如果您的Matlab版本不够新,则该函数没有“稳定”选项。在这种情况下,您可以非常轻松地使用:
这项工作如下:
对于A
第一列中的每个条目,向量e
给出该值第一次出现的索引(的第二个输出给出最大化器的第一个位置)。在您的示例中,e
是:1,1,1,4,4,6,。。。然后,向量k
将该序列转换为连续的数字:1,1,1,2,2,3,。。。由此生成结果。+1,感谢您指出unique
的版本依赖性。在我的第一次修订中,我实际上有一个不同的方法,它现在再次有效。与您的非常相似,但略短,但可能会消耗更多内存。如果有兴趣,可以看看我的编辑