Пошаговый поиск значений с минимальной амплитудой в матрице - PullRequest
0 голосов
/ 03 апреля 2020

Учитывая вектор, например, a=[1;1020;-1000;5;1040], моя цель состоит в том, чтобы найти другой вектор b такой, что для всех i:

b[i] = a[i], if abs(a[i])<abs(a[i]+1024), abs(a[i])<abs(a[i]-1024),
b[i] = a[i]+1024, if abs(a[i]+1024)<abs(a[i]), abs(a[i]+1024)<abs(a[i]-1024)
b[i] = a[i]-1024, if abs(a[i]-1024)<abs(a[i]), abs(a[i]-1024)<abs(a[i]+1024)

Правильный ответ в примере: b=[1,-4,24,5,16]

Я хочу векторизованное решение. Я пытался решить эту проблему, сначала построив следующую матрицу: temp=[a,a+1024,a-1024], затем найдя индекс с минимальным абсолютным значением: [~,ind]=min(abs(temp),[],2), а затем применив индекс: b = temp (:,ind). Последнее утверждение не работает так, как я хочу, и я не уверен, как заставить его работать.

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

ind - это просто индекс столбца в 2d-массиве, вам нужно преобразовать его в 1d-индекс, используя sub2ind

, и вы получите то, что вам нужно.

b=temp(sub2ind(size(temp),(1:length(a)),ind'));
1 голос
/ 03 апреля 2020

Упростите математику перед началом программирования, это очень помогает. Согласно вашей формуле 1024 вычитается для всех значений выше 512. 1024 добавляется для всех значений ниже -512. Делает намного более простой код:

b=a;
b(b>512)=b(b>512)-1024
b(b<-512)=b(b<-512)+1024
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...