2

3x3 行列 A があります。また、A の最大固有値として値gを計算します。すべての値の要素 A(3,3) = 0 を 0.10 刻みで 0 から 1 に変更しようとしています。次に、値ごとにgを更新します。他のすべてのマトリックス要素は同じままにしたいと思います。

forループがこれを行う方法だと思いましたが、この更新を1つのますます大きなマトリックスとして保存せずに、マトリックス内の1つの要素のみを更新する方法がわかりません。A(3,3) = pの要素を呼び出すと(それによって新しい行列 Atry が作成されます)、必要な 0 から 1 までのすべての値を取得できます (以下を参照)。必要なgのすべての値を取得するために Atry を更新する方法がわかりません。Atry をpの異なる値で更新してからgの値を計算する方法がわからないため、コードの状態はすべての反復でgの同じ値を与えるようになりました。

これを行う方法についての提案、またはウェブ検索に対する専門用語やフレーズの提案をいただければ幸いです。

A = [1 1 1; 2 2 2; 3 3 0];  
g = max(eig(A));

% This below is what I attempted to achieve my solution
clear all  
p(1) = 0;
Atry = [1 1 1; 2 2 2; 3 3 p];  
g(1) = max(eig(Atry));  

for i=1:100;  
    p(i+1) = p(i)+ 0.01;
    % this makes a one giant matrix, not many  
    %Atry(:,i+1) = Atry(:,i); 
    g(i+1) = max(eig(Atry));  
end  
4

2 に答える 2

2

これにより、やりたいことが達成されます。

A = @(x) [1 1 1; 2 2 2; 3 3 x];
p = 0:0.01:1;
g = arrayfun(@(x) eigs(A(x),1), p);

壊す:

  • A無名関数として定義します。これは、コマンドが に等しい要素を持つA(x)行列を返すことを意味します。A(3,3)x
  • ベクトルで実行するすべてのステップを定義しますp
  • 次に、実際のループの代わりにp使用して、すべての要素を「ループ」します。arrayfun

によってループされる関数は、 arrayfunis not max(eig(A))but eigs(A,1)、つまり1最大の固有値です。結果は同じになりますが、 で使用されるアルゴリズムeigsは、問題の種類により適しています。すべての固有値を計算してから最大値のみを使用するのではなく、最大値のみを計算します。言うまでもなく、これははるかに高速です。

于 2012-09-19T04:16:14.403 に答える
1

まず、質問のテキストで 0.1 の増分と言っていますが、実際には 0.01 の増分に関心があることをコードが示していますか? 0.01 単位という前提で操作します。

さて、それはさておき、あなたの質問に対する私の解釈を踏まえて、あなたがどのような人物であると私が信じているかを述べさせてください。行列 A を反復処理したいとします。反復ごとに A(3, 3) を 0.01 ずつ増やします。0 から 1 までのすべての値が必要な場合、これは 101 回の反復を意味します。反復ごとに、A の最大固有値を計算し、これらすべての固有値を何らかのベクトル (gVec と呼びます) に格納します。これが正しければ、次のことだけが必要だと思います。

% Specify the "Current" A
CurA = [1 1 1; 2 2 2; 3 3 0];  
% Pre-allocate the values we want to iterate over for element (3, 3)
A33Vec = (0:0.01:1)';
% Pre-allocate a vector to store the maximum eigenvalues
gVec = NaN * ones(length(A33Vec), 1);
% Loop over A33Vec
for i = 1:1:length(A33Vec)
    % Obtain the version of A that we want for the current i
    CurA(3, 3) = A33Vec(i);
    % Obtain the maximum eigen value of the current A, and store in gVec
    gVec(i, 1) = max(eig(CurA));
end

編集:おそらく、このコードを matlab エディターに貼り付けるのが最善です。スタックオーバーフローの自動テキストハイライトは、何の恩恵も受けていません:-)

編集:Rodyのソリューション(+1)を使用してください-それははるかに優れています!

于 2012-09-19T03:58:07.397 に答える