Какой правильный синтаксис для применения функции к подэлементам матрицы без использования цикла? - PullRequest
0 голосов
/ 10 февраля 2010

У меня есть определенная функция (GetDepth), которая делает что-то довольно тривиальное, например принимает матрицу 2x4 и выводит матрицу 2x1. Затем у меня есть матрица 2x4xn, к которой я хочу ее применить, и я ожидаю получить результат матрицы 2x1xn.

Каков правильный синтаксис для применения моей функции к матрице, не прибегая к использованию цикла?

Под ред. В соответствии с просьбой, вот пример того, что я пытаюсь сделать:

function [bidWSize, askWSize] = getWSizes(m, bookSizeHistory)
    bidWSize = sum(bookSizeHistory(2:4, 1, m));
    askWSize = sum(bookSizeHistory(2:4, 2, m));
end

В настоящее время я зацикливаюсь и подаю на выход 2x1xn

Ответы [ 2 ]

3 голосов
/ 10 февраля 2010

Вам нужно написать функцию, чтобы она могла обрабатывать матрицы nx2x4. Если это действительно что-то тривиальное, это не должно быть слишком сложно. Если у вас есть какие-либо проблемы с этим, вы можете опубликовать это здесь и попросить помощи.

EDIT:

sum - это функция, которая хорошо работает с матрицами, поэтому вы можете достичь желаемого, просто суммируя по матрице и играя с измерениями. вам вообще не нужна эта функция:

sum(bookSizeHistory(2:4, 1:2, :))
Суммы

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

permute(sum(bookSizeHistory(2:4, 1:2, :)), [2 1 3])

должен дать вам то, что вам нужно.

1 голос
/ 11 февраля 2010

Вы можете выполнять функции для отдельных элементов, используя «.» оператор. Например, доводя каждый элемент до некоторой степени, вы должны использовать:

C=A.^B;

Вместо:

[rows,cols]=size(A);
for i=1:rows
    for j=1:cols
        C=A(i,j)^B;
    end
end

Это дает намного более короткий код, чем цикл с теми же результатами. Обычно его называют «векторизованным» кодом, который использует функции BLAS. В противном случае Matlab больше похож на интерпретируемый язык, который намного медленнее. Другие функции выполняют операции со всеми строками или столбцами в массиве. Если бы A был двумерным массивом (2,4), сумма (A) дала бы сумму каждого столбца. Где на общую сумму можно найти несколько разных способов:

A_temp=reshape(A,[1,8]);
B=sum(A_temp);

или

A=sum(sum(A));

В команде sum могут быть некоторые другие функции, позволяющие сделать это с помощью одного вызова с дополнительным аргументом, но это все еще довольно быстрый способ сделать это.

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