Неожиданный выход
Причина ваш выход [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, которую вы уже нашли. Трудная часть заключается в том, чтобы найти правильный способ применения этих методов. Требуется большой опыт и острый взгляд, чтобы полностью их использовать, так как в каждом случае вам нужно приспособиться к конкретной логике ваших операций.
Не стесняйтесь спросить, продолжаете ли вы все еще бороться со своей проблемой.
Попробуйте 'out (:, 1) = in (:, 1)' и 'out (:, 2) = in (:, 2)', это то, что вы хотите? –
Ваш пример ** является ** одномерным. Вы смущены, потому что работаете с разными масштабами. Но даже для 2-мерных массивов (которые выглядят как матрицы), если вы экспериментируете с одномерной адресацией, вы увидите, что нетрудно получить желаемые результаты, как указывает ответ Феликса. –