【发布时间】:2016-05-22 18:47:04
【问题描述】:
我想要做什么
我有一个数字数组:
>> A = [2 2 2 2 1 3 4 4];
我想找到可以找到每个数字的数组索引:
>> B = arrayfun(@(x) {find(A==x)}, 1:4);
换句话说,这个B应该告诉我:
>> for ii=1:4, fprintf('Item %d in location %s\n',ii,num2str(B{ii})); end
Item 1 in location 5
Item 2 in location 1 2 3 4
Item 3 in location 6
Item 4 in location 7 8
这就像 unique 的第二个输出参数,但不是第一次(或最后一次)出现,我想要 所有 出现。我认为这称为反向查找(其中原始键是数组索引),但如果我错了,请纠正我。
我怎样才能更快地做到这一点?
我上面给出的答案是正确的,但它会随着唯一值的数量而急剧增加。对于一个真正的问题(A 有 10M 个元素和 100k 个唯一值),即使这个愚蠢的 for 循环也快 100 倍:
>> B = cell(max(A),1);
>> for ii=1:numel(A), B{A(ii)}(end+1)=ii; end
但我觉得这不可能是最好的方法。
我们可以假设A 只包含从 1 到最大值的整数(因为如果它不包含,我总是可以通过 unique 来实现它)。
【问题讨论】:
标签: arrays matlab vectorization reverse-lookup