2017-02-15 7 views
1

以下のような2列の行列Aがある場合、scatter/plotコマンドを使用して散布図をプロットすることができます。私はhistコマンドのような出力に対応する行列を取得したいと思います。 histコマンドもベクトル出力を与えます。 ("scatter"プロットに対応する論理行列を取得する方法は?

[0 0 0; 
0 0 0; 
0 1 0; 
0 0 1; 
0 0 0; 
0 0 0; 
1 0 0] 

のみインデックス(7,1):以下のようなものを与える必要があり、例えばアウト=散乱(:、1)、A(2)は()について

A=[7 1;3 2; 4 3] 

3,2)および(4,3)は1のみである。または、ループを使用せずに誰かに私にスニペットコードを渡すことができますか?

答えて

3

あなたがゼロ以外の行と列の位置を指定することができ、およびマトリックスの残りの部分はゼロになりsparsefullの組み合わせを使用することができます:sparseコマンド行にかかる

A = [7 1; 3 2; 4 3]; 
B = full(sparse(A(:,1), A(:,2), 1, max(A(:,1)), max(A(:,2)))) == 1; 

を最初の2つの入力が非ゼロである列の位置を指定すると、3つ目の入力は、各行と列の位置に対して非ゼロの位置を指定します。すべての非ゼロ位置が同じ係数1を得ることを意味する定数を指定することができます。行列のサイズを指定することもできます。この場合、出力の行と列は、それぞれ第1および第2の列を含む。これはsparse行列なので、これをfull行列に変換し、それを論理的にしたいので、すべての要素を1と比較したいと思うでしょう。

Bある:あるいは

B = 

    7×3 logical array 

    0 0 0 
    0 0 0 
    0 1 0 
    0 0 1 
    0 0 0 
    0 0 0 
    1 0 0 

、我々は偽logicalの予め割り当てられた行列のインデックスに線形インデックスを作成するためにsub2indを使用しtrueにのみ非ゼロの行の位置を設定することができる。

A = [7 1; 3 2; 4 3]; 
B = false(max(A(:,1)), max(A(:,2))); 
ind = sub2ind(size(B), A(:,1), A(:,2)); 
B(ind) = true; 

最初に行列を割り当て、行列にインデックスを付ける線形インデックスを計算し、最後に正しい位置をtrueに設定します。ここの出力はsparseのアプローチと同じです。

+0

ニース!私は 'accumarray(A、1)'も同じ結果を与えることも発見しました。 – dexterdev

+1

@dexterdev実際、それは非常に素晴らしい解決策です。私はそれを考えなかったのは残念です。 – rayryeng

+0

正直言って私はランダムにいくつかのMATLABのヘルプページでこのコマンドにつまずいた。 – dexterdev

3

ちょうど追加:rayryengの解決策は、座標に何かがある場合は1に等しく、そうでなければゼロに等しいという意味で結果を論理的にしたい場合は問題ありません。それでも、ヒストリにメモを追加したので、特定の座標にヒットした回数を実際にカウントするかどうかは疑問でした。この場合、あなたはR2015b +へのアクセス権を持っている場合

S = histcounts2(A(:,2),A(:,1)); 

を使用することを検討してください。そうでなければ、目的のために使用できるfileexchangeにhist2関数があります。

3

私の解決策です。 Matlabにはaccumarrayというコマンドがあります。

S = logical(accumarray(A, 1)) 

でも結果が得られます。

+1

'S = accumarray(A、1)== 1;'または 'S = ~~ accumarray(A、1);')を実行することで、これを少しコード化することができます。 – rayryeng

+1

私はこれが好きです、それが必要な場合は、ヒストグラムのようなカウントをすることもできます。 – Florian

関連する問題