0

行列の1つの要素だけのベクトルを作成するための解決策があります。

[dx,dy] = gradient(Im);
orient11 = [(-dx(1,1)) (dy(1,1)) 0];

どこ

size(orient11) =

0 0 0

つまり、orientの最初の要素、つまりorient11は、ベクトルです。他のすべての要素に対してこれを行うにはどうすればよいですか。orient12、orient13....orientnnがあります。forループが必要なことはわかっていますが、forループからどのオブジェクトにベクトルを格納しますか?ベクトルの行列を作成できないことを発見しました。

前もって感謝します。

4

2 に答える 2

1
v = -2:0.2:2;
[x,y] = meshgrid(v);
z = x .* exp(-x.^2 - y.^2);
[px,py] = gradient(z,.2,.2);

orient11 = [(-px(1,1)) (py(1,1)) 0]; % based off of your concatination there.
size(orient11)

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

ans =

     1     3

グラデーションからデータの最初の列を取得するだけで、ゼロをスタックしたい場合は、次のように実行できます。

orient11 = [(-px(:,1)) (py(:,1)) zeros(size(px,1),1)];

forループの代わりに。

アップデート:

Orient = zeros(size(px,1),3,size(px,2));
for n = 1:size(px,1)
    Orient(:,:,n) = [(-px(:,n)) (py(:,n)) zeros(size(px,1),1)];
end

のレイアウトはOrient、レイヤーで-px、py、0になります。各レイヤーは、初期データの列を表します。したがって、行4、列14にアクセスしたい場合は、を呼び出しますOrient(4,:,14)

それが理にかなっていて、役立つことを願っています!

于 2012-07-17T14:52:29.637 に答える
1

N行N行3列の行列を作成してみることができますが、操作するのはそれほど便利ではありません。これは、この行列からベクトルを抽出すると、1 x 1 x 3のベクトルが生成され、形状を変更する必要があるためです。絶対に面白くない。

代わりに、次のように、1行3列のベクトルのNN列の セル配列を作成することをお勧めします。

[dx, dy] = gradient(Im);
vec = @(i)[-dx(i), dy(i), 0];
orient = arrayfun(vec, reshape(1:numel(dx), size(dx)), 'UniformOutput', 0);

ベクトルにアクセスするには、中括弧を使用します。たとえば、(1、2)の位置のベクトルは次のようになります。

orient12 = orient{1, 2};

それが役に立てば幸い!

于 2012-07-17T15:35:29.160 に答える