Запустите свою программу с-Dlog4j.debug так, чтобы стандарт получил информацию о том, как log4j настроен - я подозревал, что это не настроено способ, которым Вы думаете, что это.
Векторизация в Matlab часто означает выделение намного большего объема памяти (создание гораздо большего массива, чтобы избежать цикла, например, с помощью трюка Тони ). Благодаря улучшенной JIT-компиляции циклов в последних версиях - вполне возможно, что выделение памяти, необходимое для вашего векторизованного решения, означает отсутствие преимущества, но, не видя кода, трудно сказать. В Matlab есть отличный построчный профилировщик, который поможет вам увидеть, какие именно части векторизованной версии требуют времени.
Пробовали ли вы построить график времени выполнения как функцию размера проблемы (либо количество элементов на вектор [в настоящее время 784], либо количество векторов [в настоящее время 10 000])? Я столкнулся с подобной аномалией при векторизации алгоритма ортогонализации Грама-Шмидта; Оказалось, что векторизованная версия была быстрее, пока проблема не выросла до определенного размера, после чего итеративная версия действительно работала быстрее, как видно на этом графике:
Вот две реализации и сценарий тестирования:
clgs.m
function [Q,R] = clgs(A)
% QR factorization by unvectorized classical Gram-Schmidt orthogonalization
[m,n] = size(A);
R = zeros(n,n); % pre-allocate upper-triangular matrix
% iterate over columns
for j = 1:n
v = A(:,j);
% iterate over remaining columns
for i = 1:j-1
R(i,j) = A(:,i)' * A(:,j);
v = v - R(i,j) * A(:,i);
end
R(j,j) = norm(v);
A(:,j) = v / norm(v); % normalize
end
Q = A;
clgs2.m
function [Q,R] = clgs2(A)
% QR factorization by classical Gram-Schmidt orthogonalization with a
% vectorized inner loop
[m,n] = size(A);
R = zeros(n,n); % pre-allocate upper-triangular matrix
for k=1:n
R(1:k-1,k) = A(:,1:k-1)' * A(:,k);
A(:,k) = A(:,k) - A(:,1:k-1) * R(1:k-1,k);
R(k,k) = norm(A(:,k));
A(:,k) = A(:,k) / R(k,k);
end
Q = A;
benchgs.m
n = [300,350,400,450,500];
clgs_time=zeros(length(n),1);
clgs2_time=clgs_time;
for i = 1:length(n)
A = rand(n(i));
tic;
[Q,R] = clgs(A);
clgs_time(i) = toc;
tic;
[Q,R] = clgs2(A);
clgs2_time(i) = toc;
end
semilogy(n,clgs_time,'b',n,clgs2_time,'r')
xlabel 'n', ylabel 'Time [seconds]'
legend('unvectorized CGS','vectorized CGS')
Чтобы ответить на вопрос «Когда не векторизовать код MATLAB» в более общем виде:
Не векторизуйте код, если векторизация не прямолинейна и делает код очень трудным для чтения. Это сделано при предположении, что