Ich frage mich, ob es möglich ist, doppelte bsxfun oder etwas ähnliches zu verwenden. Ich habe dieses Stück Code:Kann ich double forcycle by bsxfun vermeiden?
N = 5;
prob = [0.1 0.2 0 0.1; 0 0 0.05 0.1; 0.2 0.2 0 0.1];
r = rand(size(prob,1),N);
P = zeros(N, size(prob,1));
csm = cumsum(normP([zeros(size(prob,1),1),prob]),2);
for i = 1:N
P(i,:) = sum(bsxfun(@ge,r(:,i),csm),2);
end
Prob Matrix enthält Zeilen mit Elementen zwischen 0 und 1, wobei jede Reihe ist Wahrscheinlichkeitsverteilung (nach durch normP getan Normalisierung). Die erste Reihe der Wahrscheinlichkeitsmatrix wird verwendet, um das erste Element des Vektors P (Werte 1, 2 oder 4), die zweite Reihe für das zweite Element (Werte 3 oder 4) und so weiter zu erzeugen.
Ich habe bereits Vektorelemente für einen Vektor P vektorisiert, aber ich muss mehrere (N) Vektoren generieren. Es muss einen Weg geben, den Zyklus zu vermeiden.
Im Anhang gibt es die NormP-Funktion. Ich werde mich freuen, danke.
Michal Roubalik
P.S. Code of normP ist hier:
function nP = normP(P)
%
% Probability matrix normalization to hold sum of rows be equal to one
% i.e. sum(nP,2) = ones(N,1)
%
% No dependencies
srowP = sum(P,2);
good = srowP>0;
bad = ~good;
nP = zeros(size(P));
% good case
if any(good)
nP(good,:) = bsxfun(@rdivide, P(good,:), srowP(good));
end
% bad case
if any(bad)
nP(bad,:) = nan(size(P(bad,:)));
end
Bevor Sie irgendwelche fortgeschrittenen Sachen wie 'bsxfun' anfassen, machen Sie die einfachen Optimierungen. 'cumsum (normP ([zeros (size (prob, 1), 1), prob]), 2)) ist ein Ausdruck, den du immer wieder in deiner Schleife auswertest, um ihn außerhalb deiner Schleife zu berechnen. – Daniel
Und ersetzen Sie 'nP = Nullen (Größe (P));' mit 'nP = nan (Größe (P));', dann können Sie die '% bad case' löschen – Daniel
danke, ich habe den Code auch geändert Ich habe Code in der Frage bearbeitet. Es ist jetzt ungefähr 30% schneller. :) –