Как я могу упростить этот код MatLab?

Я хотел бы знать, есть ли способ избавиться от внутреннего цикла for

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 min с шагом 1 и заканчивая VALUES max
bins — это длина Arr — 1
и answer_list — это столбец чисел длиной VALUES, которые содержат дискретное значение в зависимости от размера переменной bins.


person lokilindo    schedule 23.01.2017    source источник
comment
Да. Можете ли вы показать пример ввода и ожидаемый результат?   -  person Suever    schedule 23.01.2017
comment
@Suever Я отредактировал вопрос, чтобы добавить больше информации.   -  person lokilindo    schedule 23.01.2017
comment
Лучше всего минимально воспроизводимый пример, который не обязательно является вашей полной проблемой или ее письменным описанием.   -  person Frank    schedule 23.01.2017
comment
Это действительно делает то, что вы хотите? for i = size(VALUES) будет перебирать i всего с двумя значениями (1 и 100 или, может быть, 100 и 1, если это вектор-столбец). Как говорит Фрэнк, здесь было бы полезно письменное описание вашей проблемы...   -  person Justin    schedule 23.01.2017
comment
@ Джастин, да, ты прав, я исправил это. И да, программа делает то, что я хочу.   -  person lokilindo    schedule 23.01.2017
comment
По-прежнему рекомендуется указывать, какое измерение VALUES вы хотите использовать: строки (size(VALUES,1)) или столбцы (size(VALUES,2)).   -  person EBH    schedule 24.01.2017


Ответы (1)


Я думаю, это то, что вы ищете (в комментариях есть ссылки на исходные строки в вашем коде):

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)).';

Это заменяет весь код, а не только внутренний цикл.

person EBH    schedule 23.01.2017
comment
Я не думаю, что bsxfun(@lt,VALUES,Arr.'); сработает. Поскольку Arr имеет длину всего 4 целых числа, а VALUES имеет длину 100 удвоений. (но такой ответ именно то, что я ищу) - person lokilindo; 24.01.2017
comment
@lokilindo, ты пробовал? это работает для меня... Кроме того, поскольку VALUES и Arr являются векторами, bsxfun будет работать, если вы держите их в другой ориентации (т.е. ищите .' на Arr здесь... ). Кстати, в Matlab 2016b вам даже не нужен bsxfun, он реализован в основных операторах. - person EBH; 24.01.2017
comment
Error using bsxfun Non-singleton dimensions of the two input arrays must match each other. Error in file_name (line #) out = bsxfun(@lt,VALUES,Arr.'); % if VALUES(i) < Arr(k): Это ошибка, которую я получаю. Arr состоит всего из 4 цифр, но VALUES больше 100 - person lokilindo; 24.01.2017
comment
Попробуйте это: bsxfun(@lt,VALUES(:).',Arr(:)) - person EBH; 24.01.2017
comment
Спасибо, это сработало отлично. Он поместил результат в одну строку, а не в столбец, как в моем оригинале, но решение было простым transpose здесь answer_list = out2(end,any(out,1))'; . Это было именно то, что я хотел найти спасибо. - person lokilindo; 24.01.2017