Вычислить матрицу разностей между матрицей и другой матрицей в MATLAB - PullRequest
2 голосов
/ 03 февраля 2020

Учитывая матрицу A в matlab с:

3   1
4   5
7   8

и другой матрицей B, которую можно назвать некоторыми контрольными точками (каждая строка является контрольной точкой, которую следует сравнивать с каждой строка A),

1   1
1   2

Мне нужно вычислить матрицу C, такую, что

 4    5
25   18
85   72

Где каждая строка C - это разница (в квадрате L2 норма) между каждой строкой A и строками B. Один из возможных способов сделать это в MATLAB - сначала создать нулевую матрицу C, C = zeros(5,2), а затем использовать двойные циклы for для заполнения соответствующего значения. Есть ли какой-нибудь другой эффективный / простой способ в MATLAB?

Найдите фрагмент кода ниже

C = zeros(5,2)
for i = 1:rows
    for j = 1:rows2
        C(i,j) =  (norm(A(i,:)-B(j,:)))^2
    end
end

Ответы [ 2 ]

3 голосов
/ 04 февраля 2020

Решение, аналогичное ThomasIsCoding's , но обобщенное на любое количество измерений (= столбцов). Для ответа Томаса необходимо, чтобы A и B имели ровно 2 столбца для использования комплексного представления. Здесь мы используем 3-е измерение массива вместо комплексных значений:

n = 3; % number of spatial dimensions for computing the L2 norm
A = 10*rand(20,n);
B = 10*rand(4,n);
C = sum((reshape(A,[],1,n) - reshape(B,1,[],n)).^2,3)

Сначала мы изменяем форму A, чтобы ее строки оставались строками, а столбцы располагались вдоль 3-го измерения массива. Мы изменяем B аналогично, но его строки становятся столбцами, а его столбцы перемещаются в 3-е измерение. Это расположение первых двух измерений соответствует расположению выходных данных C.

Далее мы возьмем разницу (используя неявное одноэлементное расширение, для более старых версий MATLAB вам нужно было бы использовать bsxfun), квадрат и сумма по 3-му измерению.

2 голосов
/ 04 февраля 2020

Может быть, вы можете попробовать bsxfun, как показано ниже

A = [3,1; 4,5;7,8];
B = [1,1;1,2];

% you can first rewrite A and B in complex coordinates to simplify the computation, and then compute difference of two complex values
C = abs(bsxfun(@minus,A*[1;1j],transpose(B*[1;1j]))).^2;

, и вы получите

C =

    4.0000    5.0000
   25.0000   18.0000
   85.0000   72.0000
...