A = [1 2 3; 7 6 5]
B = [3 7];
A-B = [1-3 2-3 3-3; 7-7 6-7 5-7];
ans =[-2 -1 0; 0 -1 -2]
Это операция, которую я хочу сделать. Как я мог сделать это с помощью матричных функций, отличных от итерационных решений?
A = [1 2 3; 7 6 5]
B = [3 7];
A-B = [1-3 2-3 3-3; 7-7 6-7 5-7];
ans =[-2 -1 0; 0 -1 -2]
Это операция, которую я хочу сделать. Как я мог сделать это с помощью матричных функций, отличных от итерационных решений?
Удобнее всего это сделать с помощью bsxfun
, который автоматически расширяет массивы, чтобы они соответствовали размеру (поэтому вам не нужно использовать repmat
). Обратите внимание, что мне нужно транспонировать B
, чтобы это был массив 2 на 1.
A = [1 2 3; 7 6 5]
B = [3 7];
result = bsxfun(@minus,A,B')
result =
-2 -1 0
0 -1 -2
Я думаю, что ответ Джонаса - лучший. Но для справки, вот решение с использованием явного repmat
:
A = [1 2 3; 7 6 5];
B = [3 7];
sz = size(A);
C = A - repmat(B', [1 sz(2:end)]);
Мало того, что ответ Джонаса проще, он на самом деле быстрее в 2 раза для больших матриц на моей машине.
Также интересно отметить, что в случае, когда A представляет собой массив n-d, оба эти решения делают что-то вполне разумное. Матрица C
будет иметь следующее свойство:
C(k,:,...,:) == A(k,:,...,:) - B(k)
На самом деле ответ Йонаса будет выполняться и, скорее всего, делать то, что вы хотите, в случае, когда B равно m-d, если начальные размеры A
и B'
имеют одинаковый размер. Вы можете изменить решение repmat, чтобы имитировать это... и в этот момент вы начинаете заново реализовывать bsxfun
!
bsxfun
против repmat
.
- person Colin T Bowers; 16.11.2012
Обычно вы не можете. Потребуются итеративные решения, потому что проблема плохо определена. Сложение/вычитание матриц определено только для матриц одинакового размера.
ie:
A = | 1 2 3 |
| 7 6 5 |
B = | 3 7 |
Нет смысла вычитать матрицу 1х2 из матрицы 2х3.
Однако, если вы умножите B на некоторую промежуточную матрицу, чтобы получить в результате матрицу 2x3, это сработает, т.е.:
B' * Y = | 3 3 3 |
| 7 7 7 |
eg:
B' = diag(B)
= | 3 0 |
| 0 7 |
B' * Y = | 3 3 3 |
| 7 7 7 |
Y = | 1 1 1 |
| 1 1 1 |
Следовательно, A-B'*Y
дает действительное, неитеративное решение.
A-(B'*Y) = | 1 2 3 | - | 3 3 3 |
| 7 6 5 | | 7 7 7 |
= A - (diag(B) * Y )
Единственный «обман» здесь — использование функции diag()
, которая преобразует вектор в строго диагональную матрицу. Существует способ вручную разложить набор операций умножения матриц/векторов, чтобы вручную воссоздать функцию diag()
, но это будет больше работы, чем мое решение выше.
Удачи!
repmat
(mathworks.com/help /matlab/ref/repmat.html) тем временем. Очень полезная функция. - person Dan Becker   schedule 15.11.2012