Сохранение результатов операции в матрице - PullRequest
0 голосов
/ 05 декабря 2009

Допустим, я хочу взять грех от 1 до 100 (в градусах).

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

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

x = [1 .. 100];

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

x[offset] = numberHere;

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

resultArray = sin(x);

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

Ответы [ 5 ]

6 голосов
/ 05 декабря 2009
% vectorized
x = sin((1:100)*pi/180);

или

% nonvectorized
x=[];
for i = 1:100
   x(i) = sin(i*pi/180);
end
2 голосов
/ 05 декабря 2009

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

x = sind(1:100);

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

1 голос
/ 05 декабря 2009

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

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-компиляция, которая делает его менее драматичным, чем раньше, но все же: Всегда векторизируйте, если можете .

1 голос
/ 05 декабря 2009

@ Даниэль Фат

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

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

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

for i = x    
   ...

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

1 голос
/ 05 декабря 2009

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

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

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

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