如何用MATLAB中的值填充表格

时间:2016-09-06 13:47:03

标签: matlab

我有这段代码输出我需要的所有值,包括condACGSorth的每个值。但我希望将它们放在一个漂亮的表中,condACGSorth作为列名,每个值从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

1 个答案:

答案 0 :(得分:3)

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

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

执行此操作后,使用array2table将矩阵转换为表格,然后使用'VariableNames'选项插入列名称。下面的代码就是您在帖子中的内容,但插入了% New条评论,以便您可以看到我添加或修改的位置:

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是迭代编号。行需要一个字符串的单元格数组,每个单元格是每行,所以我不得不作弊。