Matlab - быстро вычесть массив [1xN] из элементов матрицы [MxN]

Возможные дубликаты:
Как вычесть вектор из каждой строки матрицы?
Как разделить каждую строку матрицы на фиксированную строку?

У меня есть матрица (M1) из M строк и 4 столбцов. У меня есть другой массив (M2) из ​​1 строки и 4 столбцов. Я хотел бы вычесть каждый элемент в M1 соответствующим элементом столбца в M2. Другими словами, каждый столбец M1 должен быть вычтен скаляром в той же позиции столбца в M2. Я мог бы вызвать repmat(M2,M,1), который создал бы НОВУЮ матрицу размера MxN, где каждый элемент в столбце был бы одинаковым, а затем выполнить вычитание поэлементно:

M2new = repmat(M2,M,1)
final = M1 - M2new

, однако это две строчки кода и создается новый элемент в памяти. Каков самый быстрый и наименее требовательный к памяти способ выполнения этой операции?


person gallamine    schedule 11.05.2011    source источник
comment
Дубликат: Как вычесть вектор из каждой строки матрицы?... который, в свою очередь, был их дубликатом (с другой арифметической операцией): Как разделить элементы матрицы на суммы столбцов в MATLAB?, Как я могу разделить каждую строку матрицы на фиксированную строку?... Кажется быть очень распространенной проблемой. ;)   -  person gnovice    schedule 11.05.2011


Ответы (2)


Используйте bsxfun, как в следующем примере.

x=magic(4);
y=x(1,:);
z=bsxfun(@minus,x,y)

z =

     0     0     0     0
   -11     9     7    -5
    -7     5     3    -1
   -12    12    12   -12

Здесь z получается путем вычитания первой строки из каждой строки. Просто замените x своей матрицей и y вектором-строкой, и все готово.

person Community    schedule 11.05.2011

bsxfun(.) потенциально может быть более эффективным, но лично я, как старожил, рекомендую не полностью игнорировать решения на основе линейной алгебры, например:

> M1= magic(4)
M1 =
   16    2    3   13
    5   11   10    8
    9    7    6   12
    4   14   15    1
> M2= M1(1, :)
M2 =
   16    2    3   13
> M1- ones(4, 1)* M2
ans =
    0    0    0    0
  -11    9    7   -5
   -7    5    3   -1
  -12   12   12  -12

Позвольте фактическому варианту использования и профилировщику решить, какая функциональность фактически используется.

person eat    schedule 11.05.2011