2016-12-13 6 views
0

Я должен выполнить обновление матрицы на M = M + c*a*a' много раз, где c является константой и a является вектором столбца. Если размер матрицы больше 1000, это простое обновление будет стоить большую часть времени моей функции, как правило, более 1 минуты, подсчитывается profile.Эффективно выполнять элементное умножение векторов?

Основные коды:

for i = 1:N 
    _do something..._ 
    for k = 1:n 
     a(1:k) = M(1:k,1:k)*p(1:k); 
     M(1:k,1:k) = M(1:k,1:k)+c*a(1:k)*a(1:k)'; 
     M(1:k, k+1) = b(1:k); 
     M(k+1, 1:k) = b(1:k)'; 
     M(k+1, k+1) = x; 
     ...... 
    end 
end 

Я все переменные выделяется заранее, векторы-столбцы р и б известны, и x еще одна постоянная.

Поскольку у меня есть большое количество данных для обработки этой функцией, существует ли более эффективная альтернатива этому обновлению матрицы?

+0

пожалуйста разместим ваш оригинал, но упрощенный (!) Код. – thewaywewalk

+0

@thewaywewalk Спасибо, отредактировал мой вопрос. – Elkan

+0

Чувствуется [** XY-проблема **] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) - вы должны пересмотреть свой вопрос. Как бы то ни было, петля кажется вашим лучшим вариантом. – thewaywewalk

ответ

0

Вы можете связать векторы a, чтобы создать матрицу A, а затем применить умножение всего один раз.

A =[a1 a2 a3]; 
M = c * A * A.'; 

рассмотрим пример

A = rand(5,5); 
M = 0; 
c=4; 
for n = 1:5 
    M = M + c * A(:,n) * A(:,n).'; 
end 

и это один

M1 = c * A * A.' 

как M и M1 равны

+0

Извините, это моя вина, что я не сделал свой вопрос ясным. На самом деле вектор ** a ** получается из матрицы M предыдущей итерации. Я отредактировал мой вопрос. – Elkan

0

вы пробовали с помощью bsxfun?

В любом случае, bsxfun является гораздо быстрее, чем обычные умножения, а векторы/матрицы должны быть одинаковой длины (что они для вас, не так ли?), И это поэлементно работает (т.е. Вектор Nx1 bsx-умноженный на себя, дает вектор Nx1, умноженный на транспонирование, но дает матрицу NxN).

см https://mathworks.com/help/matlab/ref/bsxfun.html

использовать как bsxfun (@times, а, а ')

+0

Спасибо. Попробовали, но улучшения не найдено. – Elkan

+0

ok, pitywould have –

+0

ok, pity Я бы добавил это в качестве комментария, если бы у меня была привилегия сделать это, но (и, как видите, первый комментарий, первая ошибка ^^) –

Смежные вопросы