我有一个像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
答案 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