需要两个输出的“查找”功能?

时间:2014-01-21 08:01:44

标签: matlab loops for-loop indexing find

我正在尝试使用'for'循环找到随机生成的向量中1)大于0.5的值的数量,并输出2)大于0.8的值的数量。这就是我所拥有的

function bigger1 = bigger(input, max)
for max = 0.5:0.3:0.8;
 index = find(input > max);

end 
  bigger1=length(index);
end

例如,输入较大([.1 .2 .3 .4 .5 .6 .7 .8 .9。3 3 5])我想输出“6”和“3”

到目前为止,它只为我提供了一个'max'值的输出。

3 个答案:

答案 0 :(得分:3)

对于你正在做的事情,有几件事情并不完全正确。

  • 不要将max用作变量名称。它也是内置函数的名称,并使用它作为变量名称阴影该函数。不好的做法。
  • input
  • 相同
  • 您将max作为输入,同时将其重新定义为循环变量。这个新定义会覆盖旧定义,因此max函数输入无用。
  • 在每次迭代中,您重新定义index是什么 - 下一次调用find的输出。因此,不要惊讶于您只有 last 迭代的结果。
  • 您对find的调用实际上会找到所有真值的索引。您必须求和所有这些事件,而不是找到索引。
  • ......我现在暂时停在那里:)

更好的实施:

function out = bigger(in, mx)        
    out = zeros(size(mx));
    for ii = 1:numel(mx)
        out(ii) = sum(in > mx(ii)); end        
end

更“hacky”的代码消除了一行代码,同时保留了性能:

function out = bigger(in, mx)                
    for ii = numel(mx):-1:1
        out(ii) = sum(in > mx(ii)); end        
end

一旦你想到这一点,它可能会教你最多的东西(它也是最快的BTW):

out = @(in, mx) reshape( sum(bsxfun(@gt, in(:).', mx(:)), 2), size(mx) );

答案 1 :(得分:0)

由于你在for循环中只使用了一个变量,所以在每次迭代中都会覆盖它 - 所以很自然地只得到一个值。即,如果要存储两者,请将矢量2乘以1。

答案 2 :(得分:0)

Adiel已经解释了如何在评论中按照自己的方式进行操作,但这并不是Matlab解决此问题的方法。这是一个更简洁的方法:

I = rand(50,1);   %// btw input is a bad choice of variable name as it is a built-in matlab function which you are overriding.

bigger(1) = sum(I > 0.5);
bigger(2) = sum(I > 0.8);

或将其置于循环中:

limits = [0.5, 0.8];
for n = 1:length(limits)
    bigger(n) = sum(I > limits(n));
end