我有以下矩阵。
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
答案 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,:);