2016-06-27 22 views
3

Ich brauche den folgenden MATLAB-Code vektorisieren, die für größere Matrizen A und Multiplizität Vektoren m jetzt langsam ist:Vektorisierung des spezifischen Matlab Code

function cA = condenseM(A,m) 
% condensation of full matrix A (MxM) to type matrix (MxT) 
% m is vector of type multiplicities [m1, ...,mT], where 
% M = sum(m) 

% M,T 
M = sum(m); 
T = length(m); 

% "0" + last item index over all types 
blockTypeIndx = [0 cumsum(m)]; 

% condensed matrix generation 
cA = zeros(M,T); 
for i = 1:T 
    if m(i) > 1 
     cA(:,i) = max(A(:,blockTypeIndx(i)+1:blockTypeIndx(i+1)),[],2); 
    else 
     cA(:,i) = A(:,blockTypeIndx(i)+1:blockTypeIndx(i+1)); 
    end 
end 
end 

Das ist einfach und allgemein genug Beispielfall für die Matrix A (6x6):

A = 

0  3  3 | 1  1 | 6 
4  0  0 | 0  0 | 2 
0  0  0 | 5  0 | 0 
0  1  1 | 4  4 | 1 
2  0  0 | 0  0 | 5 
0  0  0 | 0  3 | 0 
     m1=3   m2 = 2  m3=1 

Multiplizität Vektor m für T = 3 Gehäuse:

m = 
3  2  1 

Das kondensierte matr ix cA wie folgt aussieht:

cA = condenseM(A,m) 
cA = 

3  1  6 
4  0  2 
0  5  0 
1  4  1 
2  0  5 
0  3  0 
+0

gibt es keine allgemeinen Einschränkungen sind Merkmale, die Sie kennen? wie in welchem ​​Bereich kann Länge (m), max (m), min (m) oder Größe (A) sein? – Finn

+0

A ist MxM, wobei 30 michalkvasnicka

Antwort

0

dies der für die Vektorisierung mit cellfun ein möglicher Code ist, aber auf meinem Rechner ist es langsamer als Schleife:

cb=cell2mat(cellfun(@(x) max(x,[],2),mat2cell(A,length(A),m),'Uniformoutput',false)); 
+0

Danke! Dieser Code ist jedoch langsamer als der ursprüngliche For-Loop-Code. Das ist offensichtlich Cellfun Verhalten ... – michalkvasnicka

Verwandte Themen