2015-10-26 8 views
0

документация объясняет vectorization MATLAB сВ matlab можно ли векторизовать в нескольких измерениях?

i = 0; 
for t = 0:.01:10 
    i = i + 1; 
    y(i) = sin(t); 
end 

This is a vectorized version of the same code: 

t = 0:.01:10; 
y = sin(t); 

Могу ли я применить векторизации функции с нескалярными входами и выходами? В качестве примера игрушки, взять функцию foo

function out = foo(in) 
    out(1) = in(1); 
    out(2) = in(2); 
end 

Это просто личность. Я хотел бы сделать что-то вроде

inputs = [1,2; 3,4; 5,6]; 
t = 1:3; 
outputs = foo(inputs(t,:)) 

и получить

ans = 
    1 2 
    3 4 
    5 6 

Вместо этого я в конечном итоге с

ans = 
    1 3 

Очевидно, что я либо делаю неправильно или это не возможно. Помогите!

+1

Попробуйте 'out (:, 1) = in (:, 1)' и 'out (:, 2) = in (:, 2)', это то, что вы хотите? –

+0

Ваш пример ** является ** одномерным. Вы смущены, потому что работаете с разными масштабами. Но даже для 2-мерных массивов (которые выглядят как матрицы), если вы экспериментируете с одномерной адресацией, вы увидите, что нетрудно получить желаемые результаты, как указывает ответ Феликса. –

ответ

1

В Matlab в N-мерном формате возможно прорисовка векторов. Как уже упоминалось Андреем, вы можете просто написать следующую функцию:

function out = foo(in) 
    out(:,1:size(in,2)) = in(:,1:size(in,2)); 
end 

Выход будет таким, как хотелось бы.

1

Использование (:) индексного оператора на n-мерных массивах позволяет выполнять векторизованные операции над всеми элементами. Вы можете использовать, например. измените форму, чтобы вернуть результат в ту же форму, что и вход.

function out=foo(in) 
     out=reshape(in(:),size(in)); 
+0

Но будьте осторожны с порядком по умолчанию. 'Foo = Reshape (1: 6,2,3); foo2 = reshape (7: 12,3,2) ', тогда посмотрите на' foo (:) + foo2 (:) 'vs.' foo + foo2'' vs 'foo '+ foo2' –

+0

Это было бы важно только для операций на массивы разных размеров. –

0

Неожиданный выход

Причина ваш выход [1 3] имеет дело с линейной индексации матриц. В частности, это означает, что вы можете получить доступ к полной матрице с помощью вектора, в котором вы сначала просматриваете первый столбец, затем второй столбец и так далее. Для 3x2 матрицы это было бы:

1 4 
2 5 
3 6 

in(1) = 1 Поэтому первый элемент в первом столбце. in(2) = 3 - второй элемент в первом столбце. Найдите полную документацию для индексации матриц here.

Вход

Во-вторых писать outputs = foo(inputs(t,:)) означает, что вы принимаете все строки, указанные в t с не в состоянии столбцам. Поэтому в вашем примере это эквивалентно записи outputs = foo(inputs) и outputs = foo(inputs(t,:)), когда вы помещаете все 3 строки. То, что вы можете сделать, это позволить foo() иметь два аргумента.

function out = foo(t,in) 
out = in(t,:) 

Чтобы получить доступ к строкам внутри этой функции вы могли бы написать что-то вроде:

function out = foo(in); 

[x,y] = size(in);  
for t = 1:x 
    out(t,:) = in(t,:); 
end 

Обычно векторизации используется, чтобы избежать зацикливания через скаляров. Существует множество умных способов упростить код и сократить время его вычисления.Большинство методов, таких как .* ,.^, bsxfun(), уже представлены в документации о vectorization, которую вы уже нашли. Трудная часть заключается в том, чтобы найти правильный способ применения этих методов. Требуется большой опыт и острый взгляд, чтобы полностью их использовать, так как в каждом случае вам нужно приспособиться к конкретной логике ваших операций.

Не стесняйтесь спросить, продолжаете ли вы все еще бороться со своей проблемой.

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