2017-01-23 54 views
1

我想知道是否有一種方法來擺脫內心的for循環我該如何簡化這個MatLab代碼?

for i = 1:size(VALUES) 
    for k = 2:bins+1 
     if VALUES(i) < Arr(k) 
      answer_list(i) = find(Arr == Arr(k)) - 1; 
      break 
     end 
    end 
end 

VALUES是從2 100個雙打文件到4
Arr是有4個值的數組,起始於VALUES分鐘爲1的步驟,並在最大VALUES結束
binsArr的長度 - 1
answer_list是數字VALUES長持有取決於bins variabl大小的離散值的列即

+0

是的。你可以展示示例輸入和期望輸出嗎? – Suever

+0

@Suever我編輯了這個問題來添加更多信息。 – lokilindo

+0

[mcve]是最好的,這不一定是你的完整問題,也不一定是書面描述。 – Frank

回答

2

我覺得這是你尋找什麼(在意見對原線在代碼中引用):

out = bsxfun(@lt,VALUES(:).',Arr(:)) % if VALUES(i) < Arr(k): 
out2 = size(out,1)-cumsum(out,1); % find(Arr == Arr(k)) - 1; 
answer_list = out2(end,any(out,1)).'; 

這將替換整個代碼,不僅內環。

+0

我不認爲'bsxfun(@ lt,VALUES,Arr。'); '會工作。由於'Arr'只有4個整長,'VALUES'是100個雙倍長。 (但這種回答正是我所期待的) – lokilindo

+0

@lokilindo,你有沒有_tried_?它適用於我......此外,因爲'VALUES'和'Arr'都是向量,所以'bsxfun' **將**工作,只要你保持不同的方向(即尋找'。''在'Arr'這裏...)。順便說一句,在Matlab 2016b中,你甚至不需要'bsxfun',它在基本的操作符中實現。 – EBH

+0

'使用bsxfun時出錯 兩個輸入數組的非單例尺寸必須相互匹配。 file_name(line#)中的錯誤 out = bsxfun(@ lt,VALUES,Arr。'); %如果VALUES(i) lokilindo