2015-09-09 2 views
1

У меня есть следующая матрица.Выберите столбцы матрицы с минимальным количеством значений NaN в строках

Data = [ 
    672 741 642 NaN 826 NaN NaN NaN NaN; 
    589 371 237 539 555 NaN NaN NaN NaN; 
    529 699 593 578 653 NaN NaN NaN NaN; 
    552 654 337 473 697 NaN NaN NaN NaN; 
    512 421 479 553 346 NaN NaN NaN NaN; 
    325 348 356 295 337 NaN NaN NaN NaN; 
    263 369 303 338 395 NaN NaN NaN NaN; 
    503 472 372 428 563 NaN NaN NaN NaN; 
    464 NaN 444 286 436 NaN NaN NaN NaN; 
    382 208 264 196 331 NaN NaN NaN NaN; 
    416 431 405 443 491 NaN NaN NaN NaN; 
    370 414 351 137 405 NaN NaN NaN NaN; 
    631 622 597 500 555 NaN NaN NaN NaN; 
    368 373 697 538 550 NaN NaN NaN 384; 
    467 446 463 361 406 NaN NaN NaN NaN; 
    398 457 461 376 469 NaN NaN NaN NaN 
]; 

С помощью функции (что я ищу)

c = number of columns desired 
[idx_col] = select_cols(Data,3); 

Я хотел бы индексы столбцов данных, имеющих максимальное количество строк без NaNs.

Для экс:

c = 3; % number of columns desired 
    [idx_col] = select_cols(Data,3); 
idx_col{1} = 1,3,5 since they do not have NaN elements. 

c=4 
idx_col{1} = 1,2,3,5 (there is only row 9 with NaN) 
and 
idx_col{2} = 1,3,4,5 (there is only row 1 with NaN) 

c=2 
idx_col{1} = 1,3 
and 
idx_col{2} = 1,5 
and 
idx_col{3} = 3,5 
+0

И в случае связей? Например, c = 7. Или c = 2 –

+0

@AnderBiguri Я добавил пример c = 2 – gabboshow

ответ

4
Data = [ 
672 741 642 NaN 826 NaN NaN NaN NaN; 
589 371 237 539 555 NaN NaN NaN NaN; 
529 699 593 578 653 NaN NaN NaN NaN; 
552 654 337 473 697 NaN NaN NaN NaN; 
512 421 479 553 346 NaN NaN NaN NaN; 
325 348 356 295 337 NaN NaN NaN NaN; 
263 369 303 338 395 NaN NaN NaN NaN; 
503 472 372 428 563 NaN NaN NaN NaN; 
464 NaN 444 286 436 NaN NaN NaN NaN; 
382 208 264 196 331 NaN NaN NaN NaN; 
416 431 405 443 491 NaN NaN NaN NaN; 
370 414 351 137 405 NaN NaN NaN NaN; 
631 622 597 500 555 NaN NaN NaN NaN; 
368 373 697 538 550 NaN NaN NaN 384; 
467 446 463 361 406 NaN NaN NaN NaN; 
398 457 461 376 469 NaN NaN NaN NaN 
]; 

c = 4; 

% end of input 
[B,IX] =sort(sum(isnan(Data))); 

how_many_nans = B(c); 

% include all columns with nans less then maximum number of nans detected 

constant_columns = IX(find(B<how_many_nans)); 

% columns with exactly maximum nans dhould be taken as combination 

border_columns = IX(find(B == how_many_nans)); 

k = c - length(constant_columns); 

C = nchoosek(border_columns,k); 

% concatenate 
desired_matrix = [repmat(constant_columns,size(C,1),1) C]; 

% turn into cells 
desired_cell={}; 
for i = 1:size(desired_matrix,1) 
    desired_cell{i} = desired_matrix(i,:) 
end 
+0

Привет, NaN в строках следует рассматривать вместе – gabboshow

+0

Хорошо. Я отредактировал ответ, чтобы точно соответствовать вашим спецификациям, но IMAO вы могли бы сделать это сами. –

+0

Привет! Благодаря! Я попробовал сам и добавил ответ выше ... он дает те же результаты ... можете ли вы проверить, имеет ли смысл? – gabboshow

0
Data = [ 
672 741 642 NaN 826 NaN NaN NaN NaN; 
589 371 237 539 555 NaN NaN NaN NaN; 
529 699 593 578 653 NaN NaN NaN NaN; 
552 654 337 473 697 NaN NaN NaN NaN; 
512 421 479 553 346 NaN NaN NaN NaN; 
325 348 356 295 337 NaN NaN NaN NaN; 
263 369 303 338 395 NaN NaN NaN NaN; 
503 472 372 428 563 NaN NaN NaN NaN; 
464 NaN 444 286 436 NaN NaN NaN NaN; 
382 208 264 196 331 NaN NaN NaN NaN; 
416 431 405 443 491 NaN NaN NaN NaN; 
370 414 351 137 405 NaN NaN NaN NaN; 
631 622 597 500 555 NaN NaN NaN NaN; 
368 373 697 538 550 NaN NaN NaN 384; 
467 446 463 361 406 NaN NaN NaN NaN; 
398 457 461 376 469 NaN NaN NaN NaN 
]; 

c = 4; 

combos = combntns(1:size(Data,2),c); 
howmanyrows_notnan = zeros(size(combos,1),1); 
for i = 1 : size(combos,1) 
    howmanyrows_notnan(i) = numel(find(all(~isnan(Data(:,combos(i,:))), 2)==1)); 
end 
maxval = max(howmanyrows_notnan); 
idx = find(howmanyrows_notnan == maxval); 

IDX = combos(idx,:); 
+0

Полностью законно, единственное, что есть это для цикла, который будет довольно медленным на больших входах. В моем ответе у меня есть цикл, но это используется только для того, чтобы превратить матрицу в ячейку, что, вероятно, не обязательно, я помещаю ее только для соответствия вашей спецификации. –

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