我有一个非常大的(107 x n)
矩阵X
。在这些n
列中,每个three
列都属于彼此。因此,矩阵first three
的{{1}}列构建了一个块,然后是X
列,依此类推。
在每个块中,4,5,6
列的first 100
行元素很重要first
。每当在第一列中X(1:100,1:3:end)
或zeros
的数量大于或等于NaNs
时,它应该删除整个块。
有没有办法在没有循环的情况下做到这一点?
感谢您的任何建议!
答案 0 :(得分:2)
假设输入的列数是3
的倍数,这里可能有两种方法。
方法#1
%// parameters
rl = 100; %// row limit
cl = 20; %// count limit
X1 = X(1:rl,1:3:end) %// Important elements from input
match_mat = isnan(X1) | X1==0 %// binary array of matches
match_blk_id = find(sum(match_mat)>=cl) %// blocks that satisfy requirements
match_colstart = (match_blk_id-1).*3+1 %// start column indices that satisfy
all_col_ind = bsxfun(@plus,match_colstart,[0:2]') %//'columns indices to be removed
X(:,all_col_ind)=[] %// final output after removing to be removed columns
或者如果您更喜欢“紧凑”代码 -
X1 = X(1:rl,1:3:end);
X(:,bsxfun(@plus,(find(sum(isnan(X1) | X1==0)>=cl)-1).*3+1,[0:2]'))=[];
方法#2
X1 = X(1:rl,1:3:end)
match_mat = isnan(X1) | X1==0 %// binary array of matches
X(:,repmat(sum(match_mat)>=cl,[3 1]))=[] %// Find matching blocks, replicate to
%// next two columns and remove them from X
注意:如果X
不是3
的倍数,请在使用代码前使用此代码 - X = [X zeros(size(X,1) ,3 - mod(size(X,2),3))]
。