在二进制向量中找到第n个出现的索引1(matlab)

时间:2018-11-10 09:30:27

标签: matlab vector indexing binary

我有一个像x = [0 0 1 1 1 1 1 1 1]这样的二进制向量。我想找到第七个1的索引,即9。

我知道我可以做到:

y = find(x);
index = y(7);

但是如果向量很大并且我想节省内存使用情况怎么办? y = find(x)是否会占用大量内存?如果是这样,有什么解决办法吗?

我将其用作在线性编程问题中存储非基本元素和基本元素的索引的另一种方法。因此,我想避免将索引存储为数值。

以下将是一个好的解决方案吗?

basis = [0 0 1 1 1 1 1 1 1];
basisIndex = 7;
correctIndex = getIndex(basisIndex, basis); % should be 9 when basisIndex = 7

function ret = getIndex(basisIndex, basis) 
    counter = 1;
    for value = find(basis) % iterate through [3, 4, 5, 6, 7, 8, 9]
        if counter == basisIndex
            ret = value;
            break;
        end
        counter = counter + 1;
    end
end

1 个答案:

答案 0 :(得分:2)

只需遍历x。首先,它不会创建新的向量y=find(x)(保存内存)。其次,如果basisIndex较小,效率会更高。

假设x是1e8 x 1向量。让我们将find与迭代进行比较。

basis = randi(2,1e8,1) - 1;
basisIndex = 7;

tic % your first method
y = find(basis);
index = y(basisIndex);
toc

tic % iterate through base
index = 1;
match = 0;
while true
    if basis(index)
        match = match + 1;
        if match == basisIndex
            break
        end
    end
    index = index + 1;     
end 
toc

输出

Elapsed time is 1.214597 seconds.
Elapsed time is 0.000061 seconds.

即使basisIndex很大

basisIndex = 5e7;

迭代的结果仍然更有效

Elapsed time is 1.250430 seconds. % use find
Elapsed time is 0.757767 seconds. % use iteration