0

私が望むような関数を作成するのに問題があります。私は長さNのベクトルを受け入れるとNxN行列を生成する無名関数を作成しようとしています。私は行列の各要素(すなわち、ループ)を設定したいと思います。具体的には、短い例:ベクトル入力変数の行列関数を作成する(Matlab)

N = 2; 
Qjk = @(x,y) x * y; 

for j = 1:N 
    for k = 1:N 

    Q(j,k) [email protected](x) Qjk(x(k),rand); 

    end 
end 

終わり、これは生成する必要があり、例えば:

Q = @(x) [.23*x(1), .16*x(2); .95*x(1), .62*x(2)] 

私は手で最後の式上記を書き込むことができ、必要に応じてそれが動作しますが、私は」ループ/ベクトル化でこのプロセスを自動化することはできません。ありがとう。

+0

誰もが提案を持っていますか? – ConfusinglyCuriousTheThird

答えて

1

だから?あなたが入力が長Nのベクトルである要素のN x Nマトリックスを作成したい私の理解で...より具体的には、あなたが入力ベクトルxの各要素を取得し、生成したいです新しい1 x Nベクトルxの各要素は、この新しい1 x Nベクターでスケールされますか?

あなたはbsxfunを使用してループを回避することができます

Q = bsxfun(@times, x(:).', rand(numel(x))); 

私はそれが行または列ベクトルのかどうか、何であるか形状xわからないが、私は任意の仮定をするつもりはありません。 x(:).'は、ベクトルが行ベクトルになるようにします。しかし、コードをそのまま動作させたい場合は、実際のループ自体の内部で無名関数宣言を取り除いてください。また、あなたが宣言した関数であるQjkを呼び出すのがいいでしょう。Qではないので、あなたが入れようとしている行列です。

は単にん:他の

N = 2; 
Q = zeros(N); % New - Allocate to be more efficient 
Qjk = @(x,y) x * y; 

for j = 1:N 
    for k = 1:N 

    Q(j,k) = Qjk(x(k),rand); % Change 

    end 
end 
+0

匿名の関数呼び出しを削除したら、私は上記のようにします。私はちょうどマトリックスを直接投入しました。あなたは単に 'bsxfun'を使うことはできませんか?それはあなたが望むものを行い、あなたが望むならそれを無名関数にラップすることさえできます。 'Q = @(x)bsxfun(@times、x(:)。、rand(numel(x)));'。 – rayryeng

+0

こんにちは、実際にはこれらのソリューションは私が望むことをしません - 私はその結果を 'x'の無名関数にしたいと思います。これらの両方は、最初に 'x'を定義する必要があります。何かご意見は? – ConfusinglyCuriousTheThird

+0

これは 'Q = @(x)bsxfun(@times、x(:)、rand(numel(x)));'最初に 'x'を定義する必要はありません。これは上記のコードと同じですが、無名関数にラップされています。したがって、ベクトルに入れるだけで、 'N x N'マトリックスが出力されます。 – rayryeng

関連する問題