2017-01-23 3 views
1

Я хотел бы знать, если есть способ, чтобы избавиться от внутренного циклаКак я могу упростить этот код 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 файл с 100 дублями от 2 до 4
Arr представляет собой массив с 4-мя значений, начиная с VALUES мин шаг 1 и заканчивается в VALUES макс
bins является длина Arr «s - 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' здесь ...). BTW, в Matlab 2016b вам даже не нужно 'bsxfun', оно реализовано в основных операторах. – EBH

+0

'Ошибка при использовании bsxfun Не одиночные размеры двух входных массивов должны совпадать. Ошибка в файле_имя (строка #) out = bsxfun (@ lt, VALUES, Arr. '); %, если VALUES (i) lokilindo

Смежные вопросы