Вопрос

Я пытаюсь найти какой-нибудь способ вычитать вектор размера 3 из каждого столбца матрицы 3 * (большое число) в Matlab.Конечно, я мог бы использовать цикл, но я пытаюсь найти какое-то более эффективное решение, немного похожее на numpy broadcasting.О, и я не могу использовать repmat, потому что у меня просто недостаточно памяти для его использования (поскольку он создает еще одну матрицу 3 * (большое число))...

Возможно ли это?

Это было полезно?

Решение

Циклы в MATLAB уже не так плохи благодаря оптимизации компилятора, такой как ускорение точно в срок (JITA).и т.д.В большинстве случаев я заметил, что решение с циклами в текущих версиях MATLAB является многое быстрее, чем сложные (хотя и крутые: D) однострочники.

bsxfun возможно, это сработает но по моему опыту, у него также есть проблемы с памятью, но в меньшей степени, чем у repmat.

Таким образом, синтаксис был бы следующим:

AA = bsxfun(@minus,A,b) где b является вектором и A это ваша большая матрица

Но я настоятельно рекомендую вам составить профиль циклической версии, а затем принимать решение!Скорее всего, из-за ограничений памяти у вас может не быть выбора :)

Другие советы

Другие ответы немного устарели - matlab r2016b, кажется, имеет Добавлено вещание в качестве стандартной функции .Пример от этого поста блога, который соответствует вопросу:

>> A = ones(2) + [1 5]'
A =
     2     2
     6     6
.

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

Так, может быть,

matout = matin;
for j = 1:size(matin, 1) %3 in this case
     matout(j,:) = matin(j,:) - vec_to_subtract(j);
end
.

Конечно, вы могли бы сделать это на месте, но я не знал, хотел ли вы сохранить оригинальную матрицу.

На самом деле, кажется, что http://www.frontiernet.net/~dmschwarz/genops.html (перегрузка оператора с файлами MEX) делает трюк, даже если я еще не проверил его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top