2009-12-05 2 views
-1

Предположим, я хочу принять грех от 1 до 100 (в градусах).Сохранение результатов операции в матрице

Я исхожу из C-фона, поэтому мой инстинкт состоит в том, чтобы цикл от 1 до 100 в цикле for (что-то, что я могу сделать в Matlab). В матрице/векторе/массиве я бы хранил sin (x), где x - счетчик цикла for.

Я не могу понять, как это сделать в Matlab. Должен ли я создать массив как

x = [1 .. 100]; 

А потом сделать

x[offset] = numberHere; 

Я знаю, что "правильный" путь. Для таких операций, как дополнение вы используете. + Вместо + и функции, как грех, я уверен, что вы просто делаете

resultArray = sin(x); 

Я просто хочу знать, что я мог сделать это C способ в том случае, когда-либо поднимался, таким образом, мой вопрос здесь о SO. :)

+2

+ не требуется "." перед ним для элементарной математики, просто * и/и^для умножения/деления/возведения в степень. –

ответ

1

Как и другие уже отмечали, есть для-циклов в MATLAB, а также.

help for 

должно предоставить вам все, что вам нужно, о том, как это работает.Отличие от C, что петля может перейти объектов, а не только целое число:

objects = struct('Name', {'obj1', 'obj2'}, 'Field1', {'Value1','Value2'}); 
for x = objects 
    disp(sprintf('Object %s Field1 = %d', x.Name, x.Field1)) 
end 

Этот пример выведет:

Object obj1 Field1 = Value1 
Object obj2 field1 = Value2 

Это могло бы быть сделано, как

for i=1:length(objects) 
    x = objects(i); 
    disp(sprintf('Object %s Field1 = %d', x.Name, x.Field1)) 
end 

И теперь к тому, что я действительно хотел сказать: Если вы когда-нибудь пишете цикл for в MATLAB, остановитесь и подумайте!. Для большинства задач вы можете векторизовать код так, чтобы он использовал операции с матрицами и встроенные функции вместо того, чтобы перебирать данные. Обычно это дает огромный прирост скорости. Нередко, что векторизованный код выполняет 100 раз быстрее, чем код цикла. В последних версиях MATLAB есть компиляция JIT, которая делает ее менее драматичной, чем раньше, но все же: Всегда векторизовать, если вы можете.

2

Я считаю, что это действительно может быть сделано как один лайнер в MatLab:

x = sind(1:100); 

Обратите внимание, что вы используете Синд() вместо греха(). Sin() принимает радианы в качестве аргументов.

1

Хм, если правильно понимаю, что вы хотите петля, как структура

resultArray = zeros(1,length(x)) %% initialization aint necessary I just forgot how you dynamically add members :x 
for i = 1:length(x) %% starts with 1 instead of zero 
    resultArray(i) = sin(x(i)) 
end 

Предупреждение Я не проверял это, но это должно быть о праве.

+0

Ах. Таким образом, оператор смещения is() вместо []. Благодаря! – bobber205

+0

Да, [] используется для определения массива или матрицы. Например, A = [1 3; 2 4] создаст матрицу, которая показывает, как индексируются элементы A (3) = 3, A (2) = 2 и т. Д. –

+0

Вам не хватает «конца» для этого цикла , Также для добавления объектов (которые могут быть медленными, заметьте) просто выполните: x (end + 1) = new_value; –

1

@Daniel Фатх

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

resultArray(i) = sin(x(i)) (вместо х (1))

Я думаю, вы также можете сделать:

for i = x  
    ... 

, хотя это будет вести себя по-другому, если x не является простым 1-100 вектором

6
% vectorized 
x = sin((1:100)*pi/180); 

или

% nonvectorized 
x=[]; 
for i = 1:100 
    x(i) = sin(i*pi/180); 
end 
Смежные вопросы