Я пытаюсь перевести следующий Matlab шаблон логико-индексирование в Scala код:Scala логическая индексация с для понимания
% x is an [Nx1] array of Int32
% y is an [Nx1] array of Int32
% myExpensiveFunction() processes batches of unique x.
ux = unique(x);
z = nan(size(x));
for i = 1:length(ux)
idx = x == ux(i);
z(idx) = myExpensiveFuntion(x(idx), y(idx));
end
Предположим, я работаю с val x: Array[Int]
в Scala. Каков наилучший способ сделать это?
Редактировать: Чтобы уточнить, я хочу обрабатывать партии (x, y) за один раз, сгруппированные по уникальному x и возвращать результат (z) с порядком, соответствующим начальному входу. Я открыт для сортировки x, но в итоге вам нужно вернуться к исходному несортированному заказу. Мое основное требование - обрабатывать все индексирование/сопоставление/сортировку четким и разумно эффективным способом.
Для тех, кто не знаете MatLab, не могли бы вы уточнить, какие вычисления вы хотите сделать? –
IIRC: «уникальный» Matlab возвращает уникальные значения в 'x', что переводится в' Set' в Scala. Выражение 'idx = x == ux (i);' дает булевой вектор индексов, которые соответствуют определенному уникальному значению. 'z',' x' и 'y' проецируются/сводятся к этим индексам. – bluenote10
@RandallSchulz - Самая странная часть для пользователя Scala - это то, что в matlab, если вы индексируете вектор с бинарным вектором, он будет использовать это как фильтр, для которого используются индексы. Достаточно просто, за исключением того, что вы можете назначить в свой фильтр_. Итак, 'z (a) = y (a) + 1' будет устанавливать каждый элемент из' z' равным соответствующему элементу 'y' плюс один для тех же индексов элементов, где' a' истинно (фактически, 1). –