2017-01-23 101 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