1

Я довольно новичок в MATLAB, и я изо всех сил пытаюсь найти решение этого уравнения.Улучшение производительности кода для решения уравнения

enter image description here

где размеры матриц являются {λ} = N × К, {Y} = N × D, {π} = 1 × К, а {μ} = D × К.

То, что я создал, больше похоже на чудовище, чем на эффективный код MATLAB, и это связано с серьезным недостатком навыков MATLAB.

На самом деле, я решил решить это шаг за шагом, чтобы ознакомиться с тем, как работает MATLAB. Я закончил с ультра-неэффективным кодом, который я даже не могу его комбинировать. Даже конечный результат неверен, так как я хочу создать матрицу NxK. Любое руководство будет высоко оценено.

%Dimensions: 
nn = 10; 
dd = 7; 
kk = 5; 

%Initial variables: 
lambda0 = rand(nn,kk); 
sigma = rand(1); 
Y = rand(nn,dd); 
mu = rand(dd,kk); 

%Calculate pies: 
First_part = log(pie(:)./(1.-pie(:))); % Kx1 vector 

%Calculate Second part: 
for n = 1:nn 
for d = 1:dd 
lambda_mu(d,:) = lambda0(n,:).*mu(d,:); %lambdamu is a DxK matrix 
end 
lambda_mu2(n,:) = sum(lambda_mu,2); %This is a NXD matrix 
end 

%Y-lambdamu2: 
for n = 1:nn 
YY(n,:) = Y(n,:)-lambda_mu2(n,:); % This is a NxD vector 
end 

%YY*mu: 
Second = (YY*mu)./sigma^2; % NxK 

%Third: 
Third = (mu'*mu)./2*sigma^2; % KxK 

%Final: 
for n=1:nn 
Final_part = transpose(First_part(:))+Second(n,:)-Third; 
end 

Update 1: Хорошо, я должен сам пиво. Итак, я сделал некоторый прогресс, чтобы создать матрицу {λ} = N × K, изменив код следующим образом:

Обновление [2]: Проводите слишком много времени программирования, и вы пропускаете детали. Я исправил ошибку, поскольку я установил {Y} = D × K вместо {Y} = D × N.

%Dimensions: 
nn = 10; 
dd = 7; 
kk = 5; 

%Initial variables: 
lambda0 = rand(nn,kk); 
sigma = rand(1); 
Y = rand(dd,nn); 
mu = rand(dd,kk); 
pie = rand(1,kk); 
sigma = rand(1); 

%Calculate the equation. 
for n = 1:nn 
for k = 1:kk 
    lambda(n,k) = log(pie(k)/(1-pie(k))) + (transpose(Y(:,n)-... 
     (sum(lambda0(n,1:end ~= k).*mu(:,1:end ~= k),2)))*mu(:,k))/... 
     sigma^2 - transpose(mu(:,k))*mu(:,k)/2*sigma^2; 
end 
end 

Но теперь проблема заключается в том, что она идет только до п = 5, когда я пытаюсь цикла при п = 6, например, я получаю следующее сообщение: «Индекс превышает размеры матрицы», так что практически я только получить матрицу 5 × 5. Предложения, пожалуйста?

P.S: Я даже попытался изменить лямбду от лямбда (n, k) до лямбда (k, n), но результат тот же.

+0

Спасибо за корректный вопрос, я не понимаю, почему кто-то отказался от него - незаслуженно. К сожалению, я в настоящее время не в состоянии помочь, но висеть там, кто-то придет. –

+1

Вы уверены, что указаны размеры? Кажется, это не так много для меня. Можете ли вы рассказать о том, что такое уравнение? Я хотел бы помочь, но то, что происходит на заднем плане, для меня немного загадочно. –

+0

Hey @RodyOldenhuis благодарит за изменение! – Jespar

ответ

0

Для того, чтобы получить размеры работают, умножить на ones(nn,kk) и ones(1,kk)

nn = 10; 
dd = 7; 
kk = 5; 

%Initial variables: 
lambda0 = rand(nn,kk); 
sigma = rand(1); 
Y = rand(nn,dd); 
mu = rand(dd,kk); 
pie = rand(kk,1); 

%Calculate pies: 
First_part = ones(nn,kk)*log(pie./(1.-pie))*ones(1,kk); % Kx1 vector 

%Calculate Second part: 
for n = 1:nn 
    for d = 1:dd 
     lambda_mu(d,:) = lambda0(n,:).*mu(d,:); %lambdamu is a DxK matrix 
    end 
    lambda_mu2(n,:) = sum(lambda_mu,2); %This is a NXD matrix 
end 

%Y-lambdamu2: 
for n = 1:nn 
    YY(n,:) = Y(n,:)-lambda_mu2(n,:); % This is a NxD vector 
end 

%YY*mu: 
Second_part = (YY*mu)./sigma^2; % NxK 

%Third: 
Third_part = ones(nn,kk)*(mu'*mu)./2*sigma^2; % KxK 


%Final: 
for n=1:nn 
    Final_part(n,:) = First_part(n,:)+Second_part(n,:)-Third_part(n,:); 
end 

EDIT: Я больше думал, как:

%Initial variables: 
lambda = rand(nn,kk); 
sigma = rand(1); 
y = rand(nn,1); 
mu = rand(nn,kk); 
pie = rand(1,kk); 

%Calculate pies: 
First_part = ones(nn,1)*log(pie./(1-pie)); % NxK vector 

, чтобы избежать петель.

Может использовать что-то вроде:

ones(kk)-diag([ones(kk,1)]) 

, делая сумму более i не равной j, а точнее использовать третье измерение для представления j.

+0

Я только что заметил, что что-то не так с lambda0 (n,:). * Mu (d, :); % lambdamu - это матрица DxK'. Вы произвольно умножаете NxK на DxK-матрицы. – Solstad

+0

Можете ли вы объяснить, что такое D ('dd') измерение в уравнении? – Solstad

+0

Я бы переписал все это, более систематически, когда 'n' является первым измерением,' i' является вторым, а 'j' является третьим, последовательно. Более того, я бы сделал матричную алгебру, а не цикл (чтобы улучшить производительность кода). – Solstad

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