4

私は行列Aを持っています

A= [0 0 2 2 2 2 0 0 1 1 1 0 3 3;
    2 2 2 2 0 0 1 1 1 0 0 3 3 0;

ご覧のとおり、その中には連続した番号があります。たとえば、2 2 2 21行目と2行目に注意してください。

この行列で発生する各数値(または少なくとも1から私の行列の最大数までのすべての数値)について、この数値とこの数値のシーケンスを元の行列でのみ示す出力行列が必要です。

たとえば、次の場合1:最初の行に3つの連続した数字があり、2番目の行に3つの数字があります:これを最初の出力行列に次のように示します。

Matrix 1 = [ 0 0 0 0 0 0 0 0 1 2 3 0 0 0;
             0 0 0 0 0 0 0 1 2 3 0 0 0 0]

番号も同じ2

Matrix 2 = [ 0 0 1 2 3 4 0 0 0 0 0 0 0 0;
             1 2 3 4 0 0 0 0 0 0 0 0 0 0]

および3

Matrix 3 = [ 0 0 0 0 0 0 0 0 0 0 0 0 1 2;
             0 0 0 0 0 0 0 0 0 0 0 1 2 0]

ご覧のとおり、各出力マトリックスは、連続して発生する数値をカウントフォワードすることを示しています。

したがって、この場合、行列Aの最大値が3であるため、3つの出力行列があります。

4

3 に答える 3

8

あなたはこれを試すことができます:

A= [0 0 2 2 2 2 0 0 1 1 1 0 3 3;
    2 2 2 2 0 0 1 1 1 0 0 3 3 0];

result = arrayfun(@(b) (A == b).*cumsum((A == b),2),nonzeros(unique(A)), 'UniformOutput', false);

この例では、変数の結果に3つの部分行列があります。

result = 

    [2x14 double]
    [2x14 double]
    [2x14 double]

それらにアクセスするには、次の構文を使用します。

result{1}
result{2}
result{3}

次に、次のようになります。

ans =

     0     0     0     0     0     0     0     0     1     2     3     0     0     0
     0     0     0     0     0     0     1     2     3     0     0     0     0     0


ans =

     0     0     1     2     3     4     0     0     0     0     0     0     0     0
     1     2     3     4     0     0     0     0     0     0     0     0     0     0


ans =

     0     0     0     0     0     0     0     0     0     0     0     0     1     2
     0     0     0     0     0     0     0     0     0     0     0     1     2     0

〜edit〜
コメントで尋ねられたように、Aが3Dマトリックスである場合、このコードはまったく同じように機能しますが、結果の構造は少し異なります。

result = 
    [2x14x2 double]
    [2x14x2 double]
    [2x14x2 double]

これらのマトリックスにアクセスするには、たとえば

result{1}(:,:,1) % for the results of comparing A(:,:,1) with value 1
result{1}(:,:,2) % for the results of comparing A(:,:,2) with value 1
于 2012-07-24T15:27:44.643 に答える
4

質問が変更されたため編集

これは最適にはほど遠いですが、あなたが望むことをします

 V = 1;
 C = A' == V;
 D = cumsum(C).*C
 E = D'

今あなたの例EになりMatrix1ます。とVを取得するには、2と3に変更します。あなたがのようなものを持っているならMatrix2Matrix3

 A = [2 2 2 0 0 0 0 0 2 2 2] 

その後、あなたは得るでしょう

 [1 2 3 0 0 0 0 0 4 5 6]

だからそれはあなたが望むものではないかもしれません。これが当てはまるかどうかはあなたの質問からは明らかではありませんが、そうでない場合は教えてください。答えを削除します

于 2012-07-24T15:17:15.450 に答える
4

これは、開始するためのループベースのソリューションです。

A = [
  0 0 2 2 2 2 0 0 1 1 1 0 3 3;
  2 2 2 2 0 0 1 1 1 0 0 3 3 0
];

mx = max(A(:));
AA = cell(mx,1);
for num=1:mx
    AA{num} = zeros(size(A));
    for r=1:size(A,1)
        idx = ( A(r,:) == num );
        AA{num}(r,idx) = sum(idx):-1:1;
    end
end

結果:

>> AA{1}
ans =
     0     0     0     0     0     0     0     0     3     2     1     0     0     0
     0     0     0     0     0     0     3     2     1     0     0     0     0     0
>> AA{2}
ans =
     0     0     4     3     2     1     0     0     0     0     0     0     0     0
     4     3     2     1     0     0     0     0     0     0     0     0     0     0
>> AA{3}
ans =
     0     0     0     0     0     0     0     0     0     0     0     0     2     1
     0     0     0     0     0     0     0     0     0     0     0     2     1     0

編集:

3次元の行列で動作するようにコードを更新しました。

A = zeros(2,7,2);
A(:,:,1) = [2 2 2 0 0 1 1 ; 0 0 2 2 2 1 1];
A(:,:,2) = [1 1 2 2 2 0 0 ; 0 1 1 0 2 2 2];

mx = max(A(:));
AA = cell(mx,1);
for num=1:mx
    AA{num} = zeros(size(A));
    for p=1:size(A,3)
        for r=1:size(A,1)
            idx = ( A(r,:,p) == num );
            AA{num}(r,idx,p) = 1:sum(idx);
        end
    end
end

結果:

%# contains consecutive numbers corresponding to number 1 in all slices
>> AA{1}
ans(:,:,1) =
     0     0     0     0     0     1     2
     0     0     0     0     0     1     2
ans(:,:,2) =
     1     2     0     0     0     0     0
     0     1     2     0     0     0     0

%# contains consecutive numbers corresponding to number 2 in all slices
>> AA{2}
ans(:,:,1) =
     1     2     3     0     0     0     0
     0     0     1     2     3     0     0
ans(:,:,2) =
     0     0     1     2     3     0     0
     0     0     0     0     1     2     3
于 2012-07-24T15:19:13.803 に答える