Да, это возможно. Вы можете сохранить все свои результаты в матрице, преобразовать матрицу в таблицу и добавить необходимые заголовки.
Во-первых, создайте матрицу, где общее число столбцов будет равно 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
- номер итерации. Строкам требуется массив ячеек строк, где каждая ячейка находится в строке, поэтому мне пришлось немного обмануть.
Вы используете 'cgs' от MATLAB? Если это так, оператор 'cgs' является неполным. Для этого требуется вектор правой руки 'b', поскольку вы пытаетесь решить линейную систему уравнений с использованием метода сопряженного градиента. Измените свой код, чтобы сделать его работоспособным. – rayryeng
@rayryeng no cgs была моей собственной функцией. Я изменил его, чтобы просто сказать qr(). Код должен работать, но не дает соответствующих значений. Благодарю. – jchaykow
Нет проблем. Вы можете изменить его, потому что я не знал, что вы используете собственную функцию 'cgs'. Вероятно, вы хотите сделать это ясно в своем посте. – rayryeng