【问题标题】:Update only one matrix element for iterative computation只更新一个矩阵元素以进行迭代计算
【发布时间】:2012-09-19 03:04:01
【问题描述】:

我有一个 3x3 矩阵 A。我还计算了一个值 g,作为 A 的最大特征值。我试图将元素 A(3,3) = 0 更改为以 0.10 为增量从零到一的所有值,然后为每个值更新 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  

【问题讨论】:

    标签: matlab for-loop matrix


    【解决方案1】:

    这也将完成你想做的事情:

    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 中定义您要执行的所有步骤
    • 然后使用arrayfun 而不是实际循环“循环”通过p 中的所有元素。

    arrayfun循环的函数不是max(eig(A))而是eigs(A,1),即1最大的特征值。结果将是相同的,但 eigs 使用的算法更适合您的问题类型 - 而不是计算 所有 特征值,然后只使用最大值,您 计算最大值。不用说,这要快得多。

    【讨论】:

    • Rody,谢谢,这是对我的问题的一个非常简洁的解决方案。我对 MATLAB 和编程比较陌生。我将需要探索更多关于匿名函数和 arrayfun 的信息,但是,我不确定自己是如何发现它们的。谢谢您的帮助。我相信我以后会问更多的 MATLAB 问题。
    【解决方案2】:

    首先,您在问题文本中说 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) - 更好!

    【讨论】:

    • 用户 Amro 创建了一个用户脚本,该脚本将在您的浏览器中修复 Matlab 在 SE 上的突出显示,请参阅 Matlab tag wiki。在 Firefox 中,使用 Greasemonkey 安装。 Chrome 对它有原生支持。
    • 不错。工作完美。感谢您的提醒!
    • Colin T Bowers - 如果我能够完全设想最终脚本,这绝对是我所设想的路线。虽然 Rody 的代码更简洁,但我想我会利用您提供的帮助在未来尝试新的解决方案,因为它更类似于我目前的技能组合。谢谢。
    • 您知道NaN(length(A33vec),1) 也有效吗?在 Matlab 中,NaN 是一个矩阵生成命令。命令NaN 本身被解释为NaN(1,1)inftruefalseoneszerosrand 等也同样适用。
    • 我没有。这是一个巧妙的技巧,谢谢。我肯定会使用它,因为我非常喜欢使用 NaN 而不是零或一来进行预初始化。
    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多