Matlab эффективно принимает диагональные значения матричного произведения

У меня есть две матрицы, a 2000 на 20000, b тоже 2000 на 20000. Я хочу получить диагональные элементы a'*b. Я использовал diag(a'*b), но он очень медленный (около 20 секунд), так как вычисление недиагональных элементов требует времени. Мне интересно, есть ли более быстрые способы сделать это.

Я заметил, что люди делают что-то вроде sum((T*H).*T',2), вот ссылка. Но требуется, чтобы T была квадратной матрицей. Как насчет неквадратной матрицы в моем случае?

Спасибо


person lolibility    schedule 17.10.2015    source источник
comment
дополнить свои матрицы нулями до квадрата?   -  person percusse    schedule 18.10.2015


Ответы (1)


Диагональ a'*b равна

result = sum(a'.*b.',2);

Пример (с неквадратными матрицами):

>> a = rand(4,5);
>> b = rand(4,5);
>> result = sum(a'.*b.',2)
result =
    1.6102
    0.2805
    1.5354
    0.3966
    1.1896

>> diag(a'*b)
ans =
    1.6102
    0.2805
    1.5354
    0.3966
    1.1896
person Luis Mendo    schedule 18.10.2015