2015-01-28 6 views
3

Давайте иметь матрицу M = [10 x 4 x 12]. В качестве примера я беру M(:,:,4):Назначить значения с несколькими условиями

val(:,:,4) = 

    0  0  1  0 
    0  1  1  1 
    0  0  0  1 
    1  1  1  1 
    1  1  0  1 
    0  1  1  1 
    1  1  1  1 
    1  1  1  1 
    0  0  1  1 
    0  0  1  1 

Как я могу получить это:

val(:,:,4) = 

    0  0  3  0 
    0  2  2  2 
    0  0  0  4 
    1  1  1  1 
    1  1  0  1 
    0  2  2  2 
    1  1  1  1 
    1  1  1  1 
    0  0  3  3 
    0  0  3  3 
  • Если у меня есть 1 в первом столбце, то все последующие 1 должен быть 1.
  • Если У меня есть 0 в первом столбце, но 1 во втором, все последующие 1 должны быть равны 2.
  • Если у меня есть 0 в первом и втором столбцах, а 1 в третьем, то все последующие 1-й шо uld be 3.
  • Если у меня есть 0 в первых 3 столбцах, но 1 в четвертом, то этого должно быть четыре.

Примечание: Логическая матрица M построена:

Tab = [reshape(Avg_1step.',10,1,[]) reshape(Avg_2step.',10,1,[]) ... 
    reshape(Avg_4step.',10,1,[]) reshape(Avg_6step.',10,1,[])]; 

M = Tab>=repmat([20 40 60 80],10,1,size(Tab,3)); 

ответ

5

Это очень простая pproach, который работает как для 2D, так и для 3D-матриц.

%// Find the column index of the first element in each "slice". 
[~, idx] = max(val,[],2); 

%// Multiply the column index with each row of the initial matrix 
bsxfun(@times, val, idx); 
+2

Интересный и умный подход! – Divakar

+1

Очень умный! – gmeroni

+1

Мне нравится это использование 'max'! –

1

Это может быть один подход -

%// Concatenate input array along dim3 to create a 2D array for easy work ahead 
M2d = reshape(permute(M,[1 3 2]),size(M,1)*size(M,3),[]); 

%// Find matches for each case, index into each matching row and 
%// elementwise multiply all elements with the corresponding multiplying 
%// factor of 2 or 3 or 4 and thus obtain the desired output but as 2D array 
%// NOTE: Case 1 would not change any value, so it was skipped. 
case2m = all(bsxfun(@eq,M2d(:,1:2),[0 1]),2); 
M2d(case2m,:) = bsxfun(@times,M2d(case2m,:),2); 

case3m = all(bsxfun(@eq,M2d(:,1:3),[0 0 1]),2); 
M2d(case3m,:) = bsxfun(@times,M2d(case3m,:),3); 

case4m = all(bsxfun(@eq,M2d(:,1:4),[0 0 0 1]),2); 
M2d(case4m,:) = bsxfun(@times,M2d(case4m,:),4); 

%// Cut the 2D array thus obtained at every size(a,1) to give us back a 3D 
%// array version of the expected values 
Mout = permute(reshape(M2d,size(M,1),size(M,3),[]),[1 3 2]) 

код работать со случайным 6 x 4 x 2 размера входного массива -

M(:,:,1) = 
    1  1  0  1 
    1  0  1  1 
    1  0  0  1 
    0  0  1  1 
    1  0  0  0 
    1  0  1  1 
M(:,:,2) = 
    0  1  0  1 
    1  1  0  0 
    1  1  0  0 
    0  0  1  1 
    0  0  0  1 
    0  0  1  0 
Mout(:,:,1) = 
    1  1  0  1 
    1  0  1  1 
    1  0  0  1 
    0  0  3  3 
    1  0  0  0 
    1  0  1  1 
Mout(:,:,2) = 
    0  2  0  2 
    1  1  0  0 
    1  1  0  0 
    0  0  3  3 
    0  0  0  4 
    0  0  3  0 
Смежные вопросы