2016-10-12 9 views
2

とそれらを組み合わせる:は2つの配列を比較すると、私はこれらの行列を持っている状態

I1 = [60 30 15 35 20 -25 30  5 45 25 -10 40 10]; 
I2 = [60 30 60 35 20 60 30 60 45 25 60 40 60]; 
A= 0:12 ; 

私はこれ欲しい:

Ir=[60 30 15 NaN 60 35 20 -25 NaN 60 30 5 NaN 60 45 25 -10 NaN 60 40 10 NaN 60] 
Ar= [0 1 2 2 2 3 4 5 5 5 6 7 7 7 8 9 10 10 10 11 12 12 12] 

方法: I1I2が同じである場合は、続行を。異なる場合は、I1I2の両方の要素を使用し、それらの間にNaNを挿入します。

Arは、とI2の要素が同じ場合には、Aの要素を使用し、処理を進めます。しかし、異なる場合は、Aの値を3回繰り返します。 I1の場合は1番目、次にNaNの場合はI2の場合。

これを行う方法を理解できません。これはどうすればいいですか?

+0

は[ 'ismember'](HTTPSを見てみましょう。com/help/matlab/ref/ismember.html)関数を使用します。これにより、短いコード行で 'Ir'の生成が可能になります。 – Erik

答えて

1

、下段はI2、中段はNaNで満杯です。その後、今作成したこの拡張マトリックスと同じサイズのlogicalマトリックスを作成し、このマトリックスの対応する列ごとにこのlogicalマトリックスの下2行を0に設定するこのマトリックスの列を調整します。 I1 == I2。完了したら、このlogicalマトリックスを使用して、拡張マトリックスを索引付けします。この索引付けの利点は、列のメジャー形式の要素にアクセスすることです。 I1I2の要素が互いに等しくない場合を除いて、拡張された行列の一番上の行だけをサンプルします。その場合、I1,nanおよびI2の両方を含む列全体をサンプルします。列でアクセスしたので、目的の出力は行です。結果が完了したら結果を転置する必要があります。

インデックスベクトルを作成するには同じことを行いますが、各行がインデックスID配列Aである3つの行を持つIDの行列を作成します。またAにあなたのインデックスの後、この結果を転置する必要があります:

aug = [I1; nan(1,numel(I1)); I2]; 
V = true(size(aug)); 
V(2:3, I1 == I2) = false; 
Ir = aug(V).'; 
ID = repmat(A, 3, 1); 
Ar = ID(V).'; 

我々が得る:// MathWorks社:

>> format compact 
>> Ir 
Ir = 
    Columns 1 through 17 
    60 30 15 NaN 60 35 20 -25 NaN 60 30  5 NaN 60 45 25 -10 
    Columns 18 through 23 
    NaN 60 40 10 NaN 60 
>> Ar 
Ar = 
    Columns 1 through 17 
    0  1  2  2  2  3  4  5  5  5  6  7  7  7  8  9 10 
    Columns 18 through 23 
    10 10 11 12 12 12 
+1

これは完璧です、サー。ありがとうございます – EkEhsaas

+0

申し訳ありません、私の投票を受け入れません! – EkEhsaas

+0

@EkEhsaas OK、あなたは今upvoteできますように見えます。受け入れ、あなたは非常に歓迎され、幸運です! – rayryeng

0

私は擬似コードを提供することができます。

for each value in A 
    if I1 at [current A value] equals I2 at [current A value] 
    add I1 at [current A value] to end of Ir 
    add [current A value] to end of Ar 
    else 
    add I1 at [current A value] to end of Ir 
    add NaN to Ir 
    add I2 at [current A value] to end of Ir 
    add [current A value] to Ar 3 times 

もしあなたの問題がうまくいけば、これで十分です。
ご質問がある場合はお知らせください。

0

2つのインデックスを使用して問題を解決できます。第1のインデックスiiは入力ベクトルを越え、第2のインデックスkは計算が進むにつれて増加する。 for-loopif-statementを使用した簡単なコードは次のようになります。

I1 = [60 30 15 35 20 -25 30  5 45 25 -10 40 10]; 
I2 = [60 30 60 35 20 60 30 60 45 25 60 40 60]; 
Ir = []; 
Ar = []; 
k = 1; 
for ii=1:length(I1) 
    if I1(ii)==I2(ii) 
     Ir(k) = I1(ii); 
     Ar(k) = ii-1; 
     k = k + 1; 
    else 
     Ir(k:k+2) = [I1(ii) NaN I2(ii)]; 
     Ar(k:k+2) = ii-1; 
     k = k + 3; 
    end 
end 

はになります。これを行うにはより多くのベクトル化された方法では、先頭行がI1で拡大行列を作成することです

Ir = 

    60 30 15 NaN 60 35 20 -25 NaN 60 30  5 NaN 60 45 25 -10 NaN 60 40 10 NaN 60 


Ar = 

    0  1  2  2  2  3  4  5  5  5  6  7  7  7  8  9 10 10 10 11 12 12 12 
+0

私はそれを感謝します。しかし、私はサイズが大きくなるのが悪いと聞いています。 Arはゼロから始まるものではないという問題があります。それは '0 5 6 4 2 2 ... 'のようなものです。シンプルに0:12を書きました。 ArはAに依存しています: – EkEhsaas

関連する問題