2016-05-30 4 views
1

変更部は、例えば

>> tmp = ones(5,5) 

tmp = 

    1  1  1  1  1 
    1  1  1  1  1 
    1  1  1  1  1 
    1  1  1  1  1 
    1  1  1  1  1 

欲しいコマンドのような:列番号がある場合tmpのエントリを変更

tmp(colNum - 2*rowNum > 0) = 0 

行番号の2倍以上それが生成するはずである。第2の例として

tmp = 

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

tmp(colNum - rowNum == 0) = 0をゼロにtmpの対角要素を設定する必要があります。

答えて

2

meshgridを使用して2次元座標のグリッドを生成し、これを使用して任意の条件を適用することができます。あなたが探しているバリアントは2つの2D行列を出力します。最初の行列は列の位置を示し、2番目の行列は行の位置を出力します。あなたは2Dグリッドを想定しているかのようXY間で共有それぞれ独自の空間的位置は、あなたの希望の2Dの位置を与えることがわかります

>> [X,Y] = meshgrid(1:5, 1:5) 

X = 

    1  2  3  4  5 
    1  2  3  4  5 
    1  2  3  4  5 
    1  2  3  4  5 
    1  2  3  4  5 


Y = 

    1  1  1  1  1 
    2  2  2  2  2 
    3  3  3  3  3 
    4  4  4  4  4 
    5  5  5  5  5 

例えば、上記の状況を与えられました。

したがって、あなたが最初の状況のた​​め、このような何かをするだろう:

[X,Y] = meshgrid(1:5,1:5); % Generate 2D coordinates 
tmp = ones(5); % Generate desired matrix 
tmp(X > 2*Y) = 0; % Set desired locations to 0 

我々が得る:

あなたの第二の例のために最後に
>> tmp 

tmp = 

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

[X,Y] = meshgrid(1:5,1:5); % Generate 2D coordinates 
tmp = ones(5); % Generate desired matrix 
tmp(X == Y) = 0; % Set desired locations to 0 

我々が得ます:

>> tmp 

tmp = 

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

単に次いで0

+1

ああ、華麗です。ありがとう。 – Alex

+0

全く問題ありません。がんばろう! – rayryeng

3

おそらくより効率的な溶液に所望の位置を設定するlogical /ブール条件を使用して、所望のマトリックスへのインデックスに直接それらを使用するbsxfunを使用することで、2次元のグリッド座標を生成し、置きますそう

nRows = 5; 
nCols = 5; 
bsxfun(@(col,row)~(col - 2*row > 0), 1:nCols, (1:nRows)') 

のようにあなたはそれが

bsxfun(@(col,row)~f(col,row), 1:nCols, (1:nRows)') 

そして、いやになるように、単に機能を受け入れるために、これを一般化することができますただそれだとして、それは(row,col)代わりの(col,row)を受け入れるように関数を指定する方が理にかなってかもしれない、あなたの質問はもちろんすなわち

f = @(colNum, rowNum)(colNum - 2*rowNum > 0) 

または

f = @(colNum, rowNum)(colNum - rowNum == 0) 

に式を指定する正確な方法でfを置き換えるのw MATLABのインデックス作成方法

+1

うわー、これは信じられないほどクールです。 – Alex

+1

あなたの 'bsxfun'呼び出しで変数名をチェックしたいかもしれません....具体的には、各ステートメントの終わりに向かって。 – rayryeng