Выбор элементов из вектора на основе условия другого вектора - PullRequest
1 голос
/ 05 июня 2019

Я хочу знать, как выбрать те числа, которые соответствуют (то есть, той же позиции) моим заранее определенным номерам.

Например, у меня есть эти векторы:

a = [  1 0.1   2   3 0.1 0.5   4 0.1];
b = [100 200 300 400 500 600 700 800]

Мне нужно выбрать элементы из b, которые соответствуют позициям целых чисел в a (1, 2, 3 и 4), поэтому на выходе должно быть:

output = [1  100
          2  300
          3  400
          4  700]

Как это можно сделать?

Ответы [ 4 ]

2 голосов
/ 05 июня 2019

Создайте логический индекс на основе a и примените его к a и b, чтобы получить желаемый результат:

ind = ~mod(a,1); % true for integer numbers
output = [a(ind); b(ind)].'; % build result
1 голос
/ 05 июня 2019

мы можем сгенерировать логический индекс на основе использования функции fix ()

ind = (a==fix(a));
output= [a(ind); b(ind)]'
1 голос
/ 05 июня 2019
round(x) == x ----> x is a whole number
round(x) ~= x ----> x is not a whole number
round(2.4) = 2 ------> round(2.4) ~= 2.4 --> 2.4 is not a whole number
round(2) = 2 --------> round(2)   == 2 ----> 2 is a whole number

Следуя той же логике

a = [  1 0.1   2   3 0.1 0.5   4 0.1];
b = [100 200 300 400 500 600 700 800 700];
iswhole = (round(a) == a);
output = [a(iswhole); b(iswhole)]

Результат:

output =

     1     2     3     4
   100   300   400   700
1 голос
/ 05 июня 2019

Хотя цель не ясна, решением является создание индексации для матрицы

Мое решение -

checkint = @(x) ~isinf(x) & floor(x) == x % It's very fast in a big array
[a(checkint(a))' b(checkint(a))']

Ключом здесь является создание индекса для a и b, для которого он является логическим вектором целочисленных значений в a. Эта функция checkint хорошо проверяет целое число.

Другие подходы к проверке целого числа могут быть

checkint = @(x)double(uint64(x))==x % Slower but it works fine

или

checkint = @(x) mod(x,1) == 0 % Slowest, but it's robust and better for understanding what's going on

или

checkint = @(x) ~mod(x,1) % Slowest, treat 0 as false

Это обсуждалось во многих других темах.

...