Я пытаюсь найти некоторый путь к substract размером 3 вектора из каждого столбца 3* (большое количество) матрица в Matlab. Конечно, я мог использовать цикл, но я пытаюсь найти некоторое более эффективное решение, немного как широковещательная передача numpy. О, и я не могу использовать repmat, потому что у меня просто нет достаточной памяти для использования его (поскольку он создает еще одни 3* (большое количество) матрица)...
Действительно ли это возможно?
Циклы уже не так плохи в MATLAB благодаря оптимизациям компилятора, таким как just-in-time acceleration (JITA). и т.д. Чаще всего я замечал, что решение с циклами в текущих версиях MATLAB намного быстрее, чем сложные (хотя и крутые :D) однострочники.
bsxfun
может подойти но по моему опыту, у него тоже есть проблемы с памятью, но меньше, чем у repmat
.
Так что синтаксис будет таким:
AA = bsxfun(@minus,A,b)
, где b
- вектор, а A
- ваша большая матрица
Но я призываю вас ознакомиться с зацикленной версией, а затем принять решение! Скорее всего, из-за нехватки памяти у вас не будет выбора :)
Я не знаю, ускорит ли это код, но вычитание скаляра из вектора не вызывает проблем с памятью. Поскольку размер вашей матрицы настолько асимметричен, накладные расходы от цикла for на коротком измерении незначительны.
Так что, возможно
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) тоже помогает, даже хотя я еще не тестировал.