Как хранить две переменные (x.y) из цикла? - PullRequest
1 голос
/ 15 мая 2019

Я генерирую две разные координаты (x, y) в цикле.В своем коде я только что понял, что он сохраняет последнюю переменную из цикла.Я, однако, пытаюсь сохранить все итерации из переменной setsize.Я уже пытался сохранить, используя что-то вроде:

circleposition = [0:length(setsize) x(i),y(i)]; 

Но, похоже, я делаю это неправильно, получая следующую ошибку:

Subscript indices must either be real positive integers or logicals.- 
Error using vertcat
Dimensions of matrices being concatenated are not consistent.

Вот мой оригинальный код:

setsize = 9; 
r = 340;
cx = 500;
cy = 500;
anglesegment = 2 * pi/setsize;
circleposition = []; 

for i = drange (0:setsize)
    x = r * cos(i*anglesegment) + cx;
    y = r * sin(i*anglesegment) + cy;
    circleposition = [x,y];
end 

Вывод:

circleposition =
             0    1.0000
      840.0000  500.0000

Работает только с первой / последней итерацией.Мне нужно получить 9 x и 9 y (в зависимости от размера, переменной).

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Трудно понять, какое сообщение об ошибке приходит с какой попытки, но давайте посмотрим.

У меня нет доступа к Parallel Computing Toolbox , в котором, по-видимому, необходимо использовать цикл для распределенного диапазона drange, но я предполагаю, что этот цикл может заменить на for i = 0:setsize для тестирования.

Теперь, начиная с i = 0, вы пытаетесь получить доступ к x(0) и y(0), что недопустимо ( Индексы нижнего индекса должны быть либо действительными положительными целыми числами, либо логическими ). Кроме того, вы получите 10 значений вместо 9, как вы указали в своем вопросе. Итак, начнем с i = 1.

Чтобы сохранить все 9 пар x и y, ваш circleposition должен быть массивом 9 x 2. Итак, инициализируйте его, например, circleposition = zeros(setsize, 2).

Наконец, вам нужно использовать правильное индексирование для хранения [x, y] в i -ой строке circleposition, т.е. circleposition(i, :).

Итак, исправленный код (внимание на замененной части drange) может выглядеть так:

setsize = 9; 
r = 340;
cx = 500;
cy = 500;
anglesegment = 2 * pi/setsize;
circleposition = zeros(setsize, 2);     % Initialize circleposition appropriately

for i = 1:setsize                       % Start at i = 1
    x = r * cos(i*anglesegment) + cx;
    y = r * sin(i*anglesegment) + cy;
    circleposition(i, :) = [x, y];      % Correct indexing of the row
end 

circleposition                          % Output

Выходные данные будут:

circleposition =
   760.46   718.55
   559.04   834.83
   330.00   794.45
   180.50   616.29
   180.50   383.71
   330.00   205.55
   559.04   165.17
   760.46   281.45
   840.00   500.00

О второй ошибке ( Ошибка при использовании vertcat. Размеры сцепляемых матриц не согласованы. ): Я не вижу, где вы вообще использовали вертикальную конкатенацию!?

1 голос
/ 15 мая 2019

Слушайте, это код, который работает:

setsize = 9; 
r = 340;
cx = 500;
cy = 500;
anglesegment = 2 * pi/setsize;
circleposition = zeros(setsize + 1, 2); % Changed from circleposition = []

for i = drange (0:setsize)
    x = r * cos(i*anglesegment) + cx;
    y = r * sin(i*anglesegment) + cy;
    circleposition((i+1),:) = [x,y]; % Changed from circleposition = [x,y];
end

Пояснение:

Исправлено изменение circleposition = [x,y]; на circleposition((i+1),:) = [x,y]. Без ((i+1),:) вы изменяете данные circleposition, не добавляя к ним.

Изменение circleposition = []; на circleposition = zeros(setsize + 1, 2); не требуется, просто рекомендуется выделить память для скорости, а не для небольшого количества элементов.

...