【问题标题】:How to fill a table with values in MATLAB如何在 MATLAB 中用值填充表格
【发布时间】:2016-09-06 13:47:02
【问题描述】:

我有这段代码可以输出我需要的所有值,包括condA 和CGSorth 的每个值。但我希望将它们放置在一个漂亮的表中,其中 condA 和 CGSorth 作为列名,并且从 for 循环输出的每个值都放置在表的每一行中。这在 MATLAB 中可行吗?

    nr=50; %Number of rows
    nc=10; %Number of columns
for j = 1:10,
    CondNumb=10^j-1;
    A=randn(nr,nc);
    [U,S,V]=svd(A);
    S(S~=0)=linspace(CondNumb,1,min(nr,nc));
    A=U*S*V';

    condA = cond(A)

    [Q1,R1] = cgs(A);

%  Test orthgonality of Q

    I = eye(10);

    CGSorth = norm(Q1'*Q1 - I)
end

根据要求,我使用自己的 cgs() 函数,定义如下,

function [Q,R] = cgs(A)
% CGS computes the thin QR factorization
% of A using the CGS algorithm
% --------------------------------------
[m,n] = size(A);
Q = A; R = zeros(n);
for k = 1:n
    R(1:k-1,k) = Q(:,1:k-1)'*A(:,k);
    Q(:,k) = A(:,k)- Q(:,1:k-1)*R(1:k-1,k);
    R(k,k) = norm(Q(:,k));
    Q(:,k) = Q(:,k)/R(k,k);
end
end

【问题讨论】:

  • 您在使用 MATLAB 中的 cgs 吗?如果是,cgs 语句不完整。当您尝试使用共轭梯度法求解线性方程组时,它需要右侧向量 b。请编辑您的代码以使其可运行。
  • @rayryeng no cgs 是我自己的功能。我现在将其更改为仅说 qr()。代码应该运行但不会给出适当的值。谢谢。
  • 没问题。您可以将其改回,因为我不知道您使用的是自己的 cgs 函数。您可能想在帖子中说明这一点。

标签: matlab


【解决方案1】:

是的,这是可能的。您可以将所有结果保存在矩阵中,将矩阵转换为表格并添加必要的标题。

首先,创建总列数为 2 的矩阵,其中这些列反映了您希望每次迭代检查的变量数,并且行数与循环中的迭代数相同。

完成此操作后,使用array2table 将矩阵转换为表格,然后使用'VariableNames' 选项插入列名。下面的代码是您在帖子中的代码,但插入了% New cmets,这样您就可以看到我在哪里添加或修改了:

nr=50; %Number of rows
nc=10; %Number of columns

% New - Results matrix
results = zeros(10, 2);

for j = 1:10,
    CondNumb=10^j-1;
    A=randn(nr,nc);
    [U,S,V]=svd(A);
    S(S~=0)=linspace(CondNumb,1,min(nr,nc));
    A=U*S*V';

    results(j, 1) = cond(A); % New - Add condition number to first column

    [Q1,R1] = cgs(A);

    %  Test orthgonality of Q

    I = eye(10);

    results(j, 2) = norm(Q1'*Q1 - I); % New - Add orthogonality to second column
end

% Create table
T = array2table(results, 'VariableNames', {'condA', 'CGSorth'});

% Display table
disp(T);

一旦你显示它,你会得到这样的东西:

>> format long g;
>> disp(T);

         condA                CGSorth       
    ________________    ____________________

    9.00000000000001    1.02024117343737e-15
    99.0000000000003    2.61487922829389e-14
    999.000000000017    1.02820433717383e-13
    9999.00000000003    1.08962767582649e-12
    99998.9999998966    1.14443469795116e-11
    999999.000010537    1.36760256617001e-10
    9999998.99939448    2.76938908715533e-09
    99999999.0511774    1.93287185175596e-08
     1000000006.7591    2.22854749762561e-07
    9999999331.44749    1.20332990732236e-06

我还使用format long g 来增加显示的精度位数。另请注意,由于矩阵A 每次迭代(通过randn)的随机性质,每次调用此脚本时这些数字可能会略有变化。作为额外的奖励,您可以在此表中添加行名并显示每个结果生成的迭代:

>> T = array2table(results, 'VariableNames', {'condA', 'CGSorth'}, 'RowNames', sprintfc('Iteration %d', 1:10));
>> disp(T)
                         condA                CGSorth       
                    ________________    ____________________

    Iteration 1     9.00000000000001    1.02024117343737e-15
    Iteration 2     99.0000000000003    2.61487922829389e-14
    Iteration 3     999.000000000017    1.02820433717383e-13
    Iteration 4     9999.00000000003    1.08962767582649e-12
    Iteration 5     99998.9999998966    1.14443469795116e-11
    Iteration 6     999999.000010537    1.36760256617001e-10
    Iteration 7     9999998.99939448    2.76938908715533e-09
    Iteration 8     99999999.0511774    1.93287185175596e-08
    Iteration 9      1000000006.7591    2.22854749762561e-07
    Iteration 10    9999999331.44749    1.20332990732236e-06

请注意,我使用undocumented function sprintfc 来帮助创建一个字符串元胞数组,其中每个元胞都有字符串Iteration i,其中i 是迭代次数。这些行需要一个字符串单元格数组,其中每个单元格都是每行,所以我不得不作弊。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2010-12-17
    • 2011-01-22
    • 2013-06-29
    • 2015-03-06
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多