在数组中找到满足条件的中间值

Posted

技术标签:

【中文标题】在数组中找到满足条件的中间值【英文标题】:Find the middle value in array that meets condition 【发布时间】:2020-05-11 03:43:11 【问题描述】:

我有逻辑数组(零和一)1500x700

我想在每一列中找到“1”,当列中有多个“1”时,我应该选择中间的。

这样可以吗?我知道如何找到“1”,但如果一列中有两个“1”,我不知道如何提取中间的“1”。

【问题讨论】:

【参考方案1】:

find 函数返回您的索引。

>> example=[1,0,0,1,0,1,1];
>> indices=find(example)

indices =

     1     4     6     7

>> indices(floor(numel(indices)/2))

ans =

     4

对每一列执行此操作,您就有了解决方案。

【讨论】:

【参考方案2】:

你可以

    获取find的行和列索引; 使用自定义函数应用accumarray 以获取每列的中间行索引。

x = [1 0 0 0 0; 0 0 1 0 0; 1 0 1 0 0; 1 0 0 1 0];                      % example
[ii, jj] = find(x);                                                    % step 1
result = accumarray(jj, ii, [size(x,2) 1], @(x) x(ceil(end/2)), NaN);  % step 2

注意:

对于偶数个,这给出了两个中间索引的第一个。如果您更喜欢两个中间索引的平均值,请将 @(x) x(ceil(end/2)) 替换为 @median。 对于 没有列 的列,结果为 NaN。如果您更喜欢不同的值,请将 accumarray 的输入第五个参数替换为该值。

例子:

x =
     1     0     0     0     0
     0     0     1     0     0
     1     0     1     0     0
     1     0     0     1     0

result =
     3
   NaN
     2
     4
   NaN

【讨论】:

以上是关于在数组中找到满足条件的中间值的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript - 获取满足条件的数组元素

如果条件满足,则递减数组并打印一个值

二分查找算法算法指导 意境级讲解

使用 Spark/Cassandra 的时间序列 - 如何在值满足条件时找到时间戳?

如何找到满足条件的数字的确切数量? [复制]

JavaScript常用数组元素搜索或过滤的四种方法