2

我有一个 3x3 矩阵 A。我还计算了一个值g作为 A 的最大特征值。我试图以 0.10 的增量将所有值的元素 A(3,3) = 0 从零更改为一,并且然后为每个值更新g 。我希望所有其他矩阵元素保持不变。

我认为for 循环将是执行此操作的方法,但我不知道如何仅更新矩阵中的一个元素而不将此更新存储为一个越来越大的矩阵。如果我在 A(3,3) = p处调用元素(从而创建一个新矩阵 Atry),我能够(如下)获得我想要的从 0 到 1 的所有值。我不知道如何更新 Atry 以获得我想要的所有g值。正如预期的那样,现在代码的状态将为所有迭代提供相同的g值,因为我不知道如何用不同的p值更新 Atry 以计算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而不是实际循环来“循环”所有元素。

被循环的函数arrayfun不是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 编辑器中。堆栈溢出自动文本突出显示并没有带来任何好处:-)

编辑:使用罗迪的解决方案(+1) - 它好多了!

于 2012-09-19T03:58:07.397 回答