2016-06-27 4 views
3

Мне нужна векторизация следующего кода MatLab, который теперь медленно для больших матриц векторов А и кратности т:векторизации конкретного кода MatLab

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 

Это очень просто и достаточно общее пример случая для матрицы А (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 

кратность вектор т при т = 3 случая:

m = 
3  2  1 

Конденсированного Matr IX сА выглядит следующим образом:

cA = condenseM(A,m) 
cA = 

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

есть какие-либо общие ограничения характеристики вы знаете? как в каком диапазоне может быть длина (m), max (m), min (m) или размер (A)? – Finn

+0

A - MxM, где 30 michalkvasnicka

ответ

0

это возможный код для векторизации с cellfun, но на моей машине это медленнее, чем петли:

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

Спасибо! Но этот код медленнее, чем исходный код для цикла. Это очевидное поведение клеточного анфаса ... – michalkvasnicka

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