我有一个3x3矩阵,A。我还计算一个值 g ,作为A的最大特征值。我试图改变元素A(3,3)= 0所有值从0到1以0.10为增量,然后为每个值更新 g 。我希望所有其他矩阵元素保持不变。
我认为 for loop 是这样做的方法,但我不知道如何只更新矩阵中的一个元素而不将此更新存储为一个越来越大的矩阵。如果我在A(3,3)= p 处调用该元素(从而创建一个新的矩阵Atry),我能够(下面)获得我想要的0到1的所有值。我不知道如何更新Atry以获得我想要的 g 的所有值。现在代码的状态将为我提供与所有迭代相同的 g 值,正如我所料,因为我不知道如何使用 p 然后计算 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
答案 0 :(得分: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))
而是eigs(A,1)
,即1
最大特征值。结果将是相同的,但eigs
使用的算法更适合您的问题类型 - 而不是计算所有特征值,然后只使用最大值,你仅计算最大值。不用说,这要快得多。
答案 1 :(得分: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) - 它好多了!