2013-11-13 3 views
9

Я потратил пару часов на отладку проблемы, которую я бы считал синтаксической ошибкой.для синтаксиса диапазона циклов

a = zeros(3); 
for i=1:1size(a,2) % note the missing colon between 1 and size(a,2) 
    i 
end 

Следующие только дисплеи

ans = 3 
1 

По существу, это кажется Matlab/октава разбирает выше как:

for i=1:1 
    size(a,2) 
    i 
end 

Заметим, однако, что

i=1:1size(a,2) 

производит синтаксис ошибка. Есть ли веская причина, что Matlab/Octave имеет это для синтаксиса цикла? Есть ли что-то, что должно сделать проще? Просто любопытно, есть ли у кого-нибудь какие-либо мысли об этом. Благодарю.

+0

Это странно! Является ли это Matlab или Octave - поскольку вы отметили как «оба»? Какая версия/какая платформа? – Floris

+0

Я также подумал, что это было странно. Я пробовал как Matlab, так и Octave. Octave версии 3.2.4 и Matlab 7.13.0.564 оба выпускают один и тот же вывод. Оба на Ubuntu 12.04. –

+0

Я собираюсь попробовать это, когда у меня есть второй ... – Floris

ответ

1

Ваш код эквивалентен

a = zeros(3); 
for i=1:1 
    size(a,2) 
    i 
end 

Есть несколько мест, где каждый будет использовать символ новой строки или пустое пространство, но сам анализатор не требует.

Минимальный цикл:

for i=1:3fprintf('%d',i),end 

, но я рекомендую использовать по крайней мере, через запятую версии, все остальное ужасно читать:

for i=1:3,fprintf('%d',i),end 
+0

Спасибо, что вернулись ко мне. Да. Я понимаю, что мой код эквивалентен тому, что вы разместили (если вы перечитаете вопрос, я даже разместил его). Мой вопрос был * почему * дизайнеры Matlab сделали бы дизайнерское решение, что вам не понадобится (по крайней мере) пробел между окончанием оператора диапазона и следующим утверждением. Есть ли какая-то конструкция, которая должна облегчить или сделать какую-то двусмысленность, которую они иначе не могут решить? –

4

Это действительно немного удивительно, что Синтаксис Matlab позволяет это. Я не знаю, почему это разрешено. Одной из причин может быть, чтобы позволить-петли на одной линии:

>> for i=1:3 disp(i);end 
    1 
    2 
    3 

Но интересно, убрав пространство не допускается:

>> for i=1:3disp(i);end 
for i=1:3disp(i);end 
     | 
Error: Unexpected MATLAB operator. 

Эта причина для этого, вероятно, что ряд с последующим d является другой способ записи числа с плавающей запятой (3d10 == 3e10), поэтому анализатор/токенизатор изначально думает, что вы определяете число, но затем путается, когда видит i. Пример Daniel с fprintf действительно работает, поскольку число, за которым следует f, не является допустимым числом, поэтому токенизатор понимает, что вы начали новый токен.

Я думаю, что много лет назад (> 30?), Когда они определили синтаксис Matlab, они не предвидели, что это может привести к таким трудным проблемам. Я думаю, что matlab был первоначально написан инженерами для инженеров, а не кем-то, кто знает, как разработать язык программирования общего назначения. Другие языки, такие как C или Python, используют пунктуацию для разделения условий цикла из тела цикла, поэтому нет никакой двусмысленности. Я не знаю, можно ли по-прежнему исправлять синтаксис Matlab, поскольку он может сломать старый код, который опирается на текущее поведение.

По крайней мере, если вы используете в своем коде последнюю версию Matlab, редактор warns for various problems. Обратив внимание на маленькие красные штрихи на правой границе, вы могли бы сэкономить несколько часов отладки (но, возможно, вы использовали октаву). Я пытаюсь сделать привычкой исправить все предупреждения, которые он указывает.Для вашего кода, он показывает следующее:

editor Screenshot

+0

Читая это предупреждение, кажется, что это поведение никогда не предназначалось. – Daniel

Смежные вопросы