2014-02-09 3 views
3

Я хотел бы генерировать 20 равномерно расположенных углов. Вот два не очень аккуратные решения:Функция Matlab, которая делает (0: N-1)/N * M

n = 20; 

% unnecessary line 
angles = linspace(0,2*pi,n+1); 
angles = angles(1:end-1) 

% intention unclear 
angles = (0:n-1)/n * 2*pi 

Есть ли linspace подобная функция, которая делает это в лучшую сторону?

+6

Я думаю, что вы преуспеваете, это путь. Если вы очень хотите, вы можете использовать однострочное linspace: 'angles = linspace (0,2 * pi- (2 * pi/n), n)' – Adiel

+0

Что не так с углами = linspace (0,2 * pi , п)? Или вы хотите n углов, включая 0, но не включая 2 * pi? В этом случае решение вашей двух линий (% ненужной линии) может быть оптимальным. –

+2

Я на самом деле думаю, что то, что вы наделили «намерение непонятным», является самым ясным из всех этих (для любого, у кого есть опыт работы с Matlab). Остальные откровенно кажутся немного странными. – horchler

ответ

0

linspace написан в Matlab (т. Е. Это не встроенная функция). Вы можете легко изменить его код, чтобы не генерировать последний элемент, и сохранить его как другую функцию.

Фактически, если вы видите код linspace, вы заметите, что последний элемент должен быть добавлен специально. Таким образом, ваша догадка была правильной: это более «естественный», чтобы не включать последний элемент.

В приведенном ниже коде я включаю измененные три строки и оригинальные для сравнения.

function y = linspace2(d1, d2, n) 

if nargin == 2 
    n = 100; 
end 
n = double(n+1); %// modified line 
%// Originally: n = double(n); 
n1 = floor(n)-1; 
vec = 0:n-2; 
if isinf(d2 - d1) 
    y = d1 + (d2/n1).*vec - (d1/n1).*vec; %// modified line 
    %// Originally: y = [d1 + (d2/n1).*vec - (d1/n1).*vec, d2]; 
else 
    y = d1 + (vec.*(d2-d1)/n1); %// modified line 
    %// Originally: y = [d1 + (vec.*(d2-d1)/n1), d2]; 
end 
Смежные вопросы