Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
Matlab:找到向量中元素的第一次和最后一次出现?_Matlab_Search_Matrix_Vector - Fatal编程技术网

Matlab:找到向量中元素的第一次和最后一次出现?

Matlab:找到向量中元素的第一次和最后一次出现?,matlab,search,matrix,vector,Matlab,Search,Matrix,Vector,我面临着一项不太容易处理的任务 图像I有一个向量,包含4个一、3个二、2个三和4个四,如下所示: [1,1,1,1,2,2,2,3,3,4,4,4,4] 这意味着我有1,2,3,4个不同的出现次数 我想找到这些元素的第一个位置和最后的位置。这意味着我想要: (1,5,8,10)作为向量中(1,2,3,4)的首次出现 (4,7,9,13)作为向量中(1,2,3,4)的最终出现 更重要的是,如果参考向量以随机顺序而不是排序,该怎么办 我知道如何在unique()函数的帮助下使用for循环 我

我面临着一项不太容易处理的任务

图像I有一个向量,包含4个一、3个二、2个三和4个四,如下所示:

 [1,1,1,1,2,2,2,3,3,4,4,4,4]
这意味着我有1,2,3,4个不同的出现次数

我想找到这些元素的第一个位置和最后的位置。这意味着我想要:

  • (1,5,8,10)作为向量中(1,2,3,4)的首次出现

  • (4,7,9,13)作为向量中(1,2,3,4)的最终出现

更重要的是,如果参考向量以随机顺序而不是排序,该怎么办

我知道如何在unique()函数的帮助下使用for循环

我正在寻找更有效的矢量化解决方案


谢谢您的时间,我们将非常感谢您的帮助

查看以下代码和示例,以及awnser上的代码和示例:


我不知道为什么不能在没有
for
循环的情况下使用
unique
。只需使用第二个输出,就可以确定要查找的内容

举个例子:

A = [1,1,1,1,2,2,2,3,3,4,4,4,4];
如果需要
A
中每个唯一元素第一次出现的索引,只需通过这种方式调用
unique

[~,out_first,~] = unique(A, 'first');
B = A(randperm(numel(A)))

>> B

B =

     2     1     4     2     3     2     1     1     1     4     3     4     4
此外,如果要查找
A
中每个唯一元素最后一次出现的索引,请执行以下操作:

[~,out_last,~] = unique(A, 'last');
根据您的上述示例,这是我们对第一次和最后一次事件得到的结果:

>> out_first

out_first =

     1
     5
     8
    10

>> out_last

out_last =

     4
     7
     9
    13
如果向量
A
的顺序是随机的,
unique
仍会找到相对于
A
起始位置的第一个匹配项。例如,如果我洗牌
A
中的元素:

[~,out_first,~] = unique(A, 'first');
B = A(randperm(numel(A)))

>> B

B =

     2     1     4     2     3     2     1     1     1     4     3     4     4
这是我在这个无序向量上运行
unique
时得到的结果:

>> out_first

out_first =

     2
     1
     5
     3

>> out_last

out_last =

     9
     6
    11
    13
正如你所看到的,我们第一次遇到值1,它在索引2,我们第一次遇到值2,它在索引1,以此类推。你可以在最后的遭遇中遵循同样的模式


因此,除了对
unique
进行一次函数调用之外,我看不出还有多少向量化。无需对其使用
for
循环

x = [1,1,1,1,2,2,2,3,3,4,4,4,4];
s = [1,2,3,4];
[valid, first] = max(bsxfun(@eq, x(:), s(:).'),[],1);
[~, last] = max(bsxfun(@eq, flipud(x(:)), s(:).'),[],1);
first(~valid) = 0;
last = numel(x)-last+1;
last(~valid) = 0;
这使用了
max
的第二个输出返回每个列中第一个最大化器的位置这一事实。此外,第一个输出用于确保每个值至少出现一次;如果不是这种情况,resut设置为零。例如,
s=[1,2,3,4,5]
的结果是

first =
     1     5     8    10     0
last =
     4     7     9    13     0
要获得最后的位置,使用相同的方法,仅使用翻转向量


元素在每个向量中可以按任意顺序排列。

您当然可以使用
unique
查找向量的第一个和最后一个匹配项。无需对具有
唯一性的
循环使用
。是否不想使用
unique
?如果要对向量进行排序,这只是运行长度编码。感谢您的帮助@我的荣幸。我不确定这是否回答了你的问题,但我希望它回答了!我发现一个问题是,我的查询向量,有时可能不是[1,2,3,4],它可能是[2,3],你能修改解决方案吗?不管内容如何,它都应该工作。您要做的是检查第一个输出,查看唯一元素的顺序,然后第一个输出的位置告诉您结果第一个输出的第一次和最后一次出现。没有必要修改我的答案。