我有这段代码输出我需要的所有值,包括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
答案 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
是迭代编号。行需要一个字符串的单元格数组,每个单元格是每行,所以我不得不作弊。