簡體   English   中英

需要兩個輸出的“查找”功能?

[英]“Find” function with two outputs needed?

我正在嘗試使用“ 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 5])我想輸出“ 6”和“ 3”

到目前為止,它只為我提供了“最大”值之一的輸出。

您所做的事情有些不對勁。

  • 不要使用max作為變量名。 它也是內置函數的名稱,並將其用作變量名可屏蔽該函數。 壞習慣。
  • input相同
  • 您將max作為輸入,同時將其重新定義為循環變量。 此新定義將覆蓋舊的定義,因此max函數輸入無用。
  • 在每次迭代時,您都重新定義什么index -下一個find調用的輸出。 因此,只有最后一次迭代的結果就不會感到驚訝。
  • 通常,您的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) );

由於在for循環中僅使用一個變量,因此在每次迭代中都將其覆蓋-因此很自然地只有一個值。 即,如果要同時存儲兩個向量,則將向量乘以1。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM