MATLAB: удаление нулей в массиве, собранном из цикла - PullRequest
0 голосов
/ 06 апреля 2019

Как мне удалить нули из массива, который был собран из цикла? Я зацикливаюсь, и если расстояние меньше, чем в магазине, 5, то введите его в массив closeHome. В то время как массив принимает истинные значения, я также получаю нули в массиве closeHome. Как мне собрать данные в массив без этих нулей с желаемым выводом closeHome = 5.0000 4.1231 2.8284?

x = [5 7 4 1 2]'
y = [1 2 3 4 2]'
distance = sqrt(x.^2 + y.^2)
store = 5;

for j=1:size(distance)
 if distance(j) <= store
      closeHome(j) = distance(j)
 end       
end

1 Ответ

2 голосов
/ 06 апреля 2019

Что ж, ваша проблема в том, что вы помещаете свои значения в j-ю позицию closeHome, в результате чего closeHome всегда имеет j элементов, и все элементы, для которых условие не выполняется, будут 0. Вы можете избежать этого, изменив код следующим образом:

x = [5 7 4 1 2]';
y = [1 2 3 4 2]';
distance = sqrt(x.^2 + y.^2);
store = 5;
closeHome=[];
for j=1:size(distance)
if distance(j) <= store
closeHome=[closeHome,distance(j)];
end
end

В любом случае, вы также можете значительно упростить этот код, используя возможность логической индексации в matlabs. Вы можете просто заменить цикл for следующей простой строкой:

closeHome=distance(distance<=store);

В этом случае distance<=store создаст логический массив, имеющий 1 с для всех позиций расстояния, которые меньше store и 0 для всех других позиций. Тогда индексирование расстояния с помощью этого логического массива даст желаемый результат.
И просто для вас, чтобы знать: в программировании Matlab считается плохой практикой использовать i и j в качестве переменных, потому что они представляют мнимую единицу. Таким образом, вы можете рассмотреть возможность их изменения и использовать (например) ii и jj или что-то совершенно другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...