Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 创建一个递增向量,但考虑另一个向量中相等元素的出现次数_Arrays_Matlab - Fatal编程技术网

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
的版本依赖性。在我的第一次修订中,我实际上有一个不同的方法,它现在再次有效。与您的非常相似,但略短,但可能会消耗更多内存。如果有兴趣,可以看看我的编辑