选择行中具有最小NaN值数的矩阵列

时间:2015-09-09 09:52:04

标签: matlab matrix 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);

我希望Data列的索引具有没有NaN的最大行数。

例如:

    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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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,:);