3

私は、0 と「適切な」データを含む行列データを持っています。データをゼロから分離し、これらのゼロを取り除くために、いくつかのマトリックス (新しいもの) を作成したいと考えています。

したがって、ここに簡単な例を示します。

data = 1   3   6   4
       3   6   9   5
       4   5   6   2
       0   0   0   0
       0   0   0   0
       2   4   1   8
       1   4   6   5
       0   0   0   0
       1   7   9   1
       3   4   5   8

そして、この場合、次の2つのマトリックスを取得したい:

A =1   3   6   4
   3   6   9   5
   4   5   6   2



B= 2   4   1   8
   1   4   6   5



C = 1   7   9   1
    3   4   5   8

明らかに、私のデータファイルには何千ものデータポイントがあり、これを自動化する必要があります。

それを行う方法はありますか?

4

2 に答える 2

4

ステップ 1: allを使用してゼロのみを含む行のインデックスを作成します。

index = all(data==0,2); #% data==0<-- logical matrix; the 2 means along dimension 2

ステップ 2: 目的の値の各セグメントの最初と最後のインデックスを含むベクトルを作成します。

index = [1; double(index); 1]; #% convert to numeric and pad with ones
firsts = diff(index)==-1; #% 0 (real row) - 1 (spacer row) = -1
lasts = (diff(index)==1)-1; #% subtract 1 because of padding

ステップ 3: 各セルに元の行列の連続したセグメントを含むセル配列を作成します (セル配列を使用すると、各セルは異なるサイズまたは異なる型にすることができます)。

#% firsts and lasts should be the same length
#% iterate through lists of first/last indices
for ii=1:length(firsts)
    result{ii} = data(firsts(ii):lasts(ii), :);
end

必須の Matlab 公共サービス発表: iandは一般的なループ インデックス変数です...代わり jに使用したことに気付くでしょう。理由は次のとおりです。ii

于 2013-07-31T01:18:50.750 に答える