这是我的 MATLAB 解决方案:
array = randi(5, [1 10]); %# random array of integers
n = unique(array)'; %'# unique elements
[r,~] = find(cumsum(bsxfun(@eq,array,n),2) == 4, 1, 'first');
if isempty(r)
val = []; ind = []; %# no answer
else
val = n(r); %# the value found
ind = find(array == val, 4); %# indices of elements corresponding to val
end
例子:
array =
1 5 3 3 1 5 4 2 3 3
val =
3
ind =
3 4 9 10
说明:
首先,我们提取唯一元素列表。在上面使用的示例中,我们有:
n =
1
2
3
4
5
然后使用 BSXFUN 函数,我们将每个唯一值与我们拥有的整个向量数组进行比较。这相当于以下内容:
result = zeros(length(n),length(array));
for i=1:length(n)
result(i,:) = (array == n(i)); %# row-by-row
end
继续我们得到的相同示例:
result =
1 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 1 1 0 0 0 0 1 1
0 0 0 0 0 0 1 0 0 0
0 1 0 0 0 1 0 0 0 0
接下来,我们在 result 矩阵上调用 CUMSUM 来计算沿行的累积和。每行都会告诉我们该元素到目前为止出现了多少次:
>> cumsum(result,2)
ans =
1 1 1 1 2 2 2 2 2 2
0 0 0 0 0 0 0 1 1 1
0 0 1 2 2 2 2 2 3 4
0 0 0 0 0 0 1 1 1 1
0 1 1 1 1 2 2 2 2 2
然后我们将它与四个cumsum(result,2)==4 进行比较(因为我们想要一个元素第四次出现的位置):
>> cumsum(result,2)==4
ans =
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
最后我们调用FIND按照列顺序查找第一个出现的1:如果我们逐列遍历上一步的矩阵,那么第一个出现1的行表示我们正在寻找的元素的索引。在本例中,它是第三行 (r=3),因此唯一向量中的第三个元素是答案 val = n(r)。请注意,如果我们在原始数组中有多个元素重复 4 次或更多次,那么第一次出现第四次的元素将首先显示为 1 在上述表达式中逐列显示。
查找对应答案值的索引是对 FIND 的简单调用...