Можно ли избежать ненужных вычислений?

У меня есть индексный массив ind длиной len, который является либо 0, либо 1. Мне нужно, чтобы результаты, полученные от сложной и трудоемкой функции func, были сохранены в векторе результатов res (также длина len). Вектор ввода называется inp.

Я мог сделать это двумя способами:

% 1st way:
res = zeros(len,1);
res(ind) = func(inp);

% 2nd way:
res = ind .* func(inp);

Мой вопрос для 2nd: для тех записей, где ind - это 0, оценивает ли MATLAB func()? Надеюсь, что нет, потому что нулевое значение чего-либо еще равно нулю, поэтому оценивать func - пустая трата времени.

Отвечая на ваш вопрос: MATLAB оценивает func, даже если ind равен нулю.

Ander Biguri 11.04.2018 13:26
0
1
58
2

Ответы 2

Вероятно, это так, но вам очень легко проверить это, сделав тестовый func, который печатает на консоль, а затем сделает все ind0 и посмотрите, печатает ли он что-нибудь (я уверен, что будет, но у меня нет MATLAB, чтобы проверить себя).

I hoped no because zero times sth. else is zero

Не обязательно, а как насчет 0*inf? Или 0*NaN?

Если вопрос вашего вопроса более эффективен, проверьте оба с помощью timeit

Для тех записей, где ind равен 0, ваш первый вариант не будет работать, потому что res(ind) выдаст ошибку:

Subscript indices must either be real positive integers or logicals.

В любом случае, я думаю, это то, что вы ищете:

allowed_indices = ind > 0;   % Logical indexing of valid indices
res = zeros(len,1);
res(allowed_indices) = func(inp(allowed_indices));

Другие вопросы по теме