Vectorize this?

조회 수: 3 (최근 30일)
Edward Umpfenbach
Edward Umpfenbach 2012년 5월 7일
yidx = [false(18144,1);true(24,1);false(36882,1);true(64,1);false(6,1);true(198,1)];
temp = find(yidx);
for i=1:1:size(temp,1)
i
for j = 1:1:size(cplex.Model.A,1)
if cplex.Model.A(j,temp(i)) ~= 0
temp_row = cplex.Model.A(j,:);
temp2 = find(temp_row ~= 0);
temp3 = find(temp2 == temp(i));
temp2(temp3) = [];
bin_coefficient = temp_row(1,temp(i));
for k = 1:1:size(temp2,1)
var = [j,temp2(k)];
b = cplex.Model.rhs(j,1) - bin_coefficient;
u = cplex.Model.rhs(j,1);
new_row = sparse(1,size(cplex.Model.A,2));
new_row(1,temp2(k)) = 1;
new_row(1,temp(i)) = (u-b);
cplex.Model.rhs = [cplex.Model.rhs;u];
cplex.Model.lhs = [cplex.Model.lhs;-Inf];
cplex.Model.A = [cplex.Model.A;new_row];
end
end
end
end

답변 (3개)

Stefan
Stefan 2012년 5월 7일
Hi Edward,
which structure has your cplex.Model? Without this information it's more difficult to understand the vectoroizing problem.
greetz

Jan
Jan 2012년 5월 7일
Do you really need a vectorization or do you want to accelerate the function only?
For the later, a pre-allocation is strongly recommended. For some fields this is even identical to the "vectorizatzion":
yidx = [false(18144,1); true(24,1); false(36882,1); true(64,1); false(6,1); true(198,1)];
temp = find(yidx);
A = cplex.Model.A; % Avoid repeated accessing of substructs
for i = 1:size(temp, 1)
for j = 1:size(A, 1)
if A(j,temp(i)) ~= 0
temp_row = A(j,:);
temp2 = find(temp_row ~= 0);
temp2(temp2 == temp(i)) = [];
bin_coefficient = temp_row(1,temp(i));
cplex.Model.lhs = [cplex.Model.lhs, repmat(-Inf, size(temp2,1), 1)];
% b and u do not depend on k loop, so move it outside for speed:
b = cplex.Model.rhs(j,1) - bin_coefficient;
u = cplex.Model.rhs(j,1);
cplex.Model.rhs = [cplex.Model.rhs; repmat(u, size(temp2,1), 1)];
for k = 1:size(temp2, 1)
% Not used, do not shadow the built-in VAR!
% var = [j, temp2(k)];
new_row = sparse(1,size(A,2));
new_row(1, temp2(k)) = 1;
new_row(1, temp(i)) = (u-b);
A = [A; new_row];
end
end
end
end
cplex.Model.A = A;
Is this faster already?

Stefan
Stefan 2012년 5월 7일
I think you can pre-allocate teh varibale new_row also (command 'ones()' )
Variable A is changig it's size in every loop. To accelerate pre-allocate A and use zour index k. Afterwards you can connect the single values with combine or cell2mat

카테고리

Help CenterFile Exchange에서 Cell Arrays에 대해 자세히 알아보기

태그

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by