2016-05-13 11 views
2

Как векторизовать код в MATLAB? Если возможно, я хочу, чтобы матрица B была разреженной матрицей.Векторизация кода в MATLAB

%% Y is a matrix l*n 
%% X is a matrix k*n 
B = []; 
for i=1:l 
    for j=1:n 
     temp1 = zeros(1,n*l); 
     temp1((i-1)*n+j) = -1; 
     temp2 = zeros(1,l*k); 
     temp2((i-1)*k+1:i*k) = (-Y(i,j)).*(X(:,j)'); 
     B = [B;[temp1,temp2]]; 
    end 
end 

Я не знаю, как это сделать, Благодаря!

+0

вы создаете матрицу, 'л * п * (п * л + л * к) 'Элементы долго ... это то, что вы намеревались сделать? – gariepy

+0

Я хочу решить линейное программирование. Матрица 'B', представляющая линейные ограничения. –

+0

@ZAlex Решение опубликовано решение для вас? – Divakar

ответ

0

Используя bsxfun для маскирования и векторизованных расчетов поэлементных умножений, вот Векторизованный подход -

%// Create left part of the output that is basically an identity matrix 
parte1 = -eye(n*l); 

%// Setup right part of output 
parte2 = zeros(n*l,l*k); 

%// Mask to set elements from the calculations of (-Y(i,j)).*(X(:,j)') 
M = bsxfun(@eq,reshape(repmat(1:l,n,1),[],1),reshape(repmat(1:l,k,1),1,[])); 
%// OR concisely : M = kron(eye(l),ones(n,k))==1 

%// Perform vectorized calculations of (-Y(i,j)).*(X(:,j)') and set those 
%// into second part at masked places 
parte2(M) = -bsxfun(@times,permute(X,[2,1,3]),permute(Y,[2,3,1])); 

%// Finally concatenate those parts for final output 
out = [parte1,parte2]; 
+0

большое спасибо –

+0

@ZAlex Итак, это сработало или у вас проблемы с памятью ? – Divakar

+0

Я не знаю ... потому что предел памяти превышает ... –

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