当零元素的数量超过阈值避免循环时删除某些矩阵列

时间:2014-09-16 19:03:55

标签: matlab vectorization

我有一个非常大的(107 x n)矩阵X。在这些n列中,每个three列都属于彼此。因此,矩阵first three的{​​{1}}列构建了一个块,然后是X列,依此类推。

在每个块中,4,5,6列的first 100行元素很重要first。每当在第一列中X(1:100,1:3:end)zeros的数量大于或等于NaNs时,它应该删除整个块。

有没有办法在没有循环的情况下做到这一点?

感谢您的任何建议!

1 个答案:

答案 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))]