2016-09-06 2 views
1

У меня есть этот код, который выводит все необходимые мне значения, состоящие из каждого значения condA и CGSorth. Но я хотел бы, чтобы они были помещены в хорошую таблицу с condA и CGSorth в виде имен столбцов и каждое значение, выводимое из цикла for, чтобы разместить в каждой строке таблицы. Возможно ли это в MATLAB?Как заполнить таблицу значениями в 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 

По желанию, я использую свой собственный СГС() функцию, которая определяется следующим образом,

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

Вы используете 'cgs' от MATLAB? Если это так, оператор 'cgs' является неполным. Для этого требуется вектор правой руки 'b', поскольку вы пытаетесь решить линейную систему уравнений с использованием метода сопряженного градиента. Измените свой код, чтобы сделать его работоспособным. – rayryeng

+0

@rayryeng no cgs была моей собственной функцией. Я изменил его, чтобы просто сказать qr(). Код должен работать, но не дает соответствующих значений. Благодарю. – jchaykow

+0

Нет проблем. Вы можете изменить его, потому что я не знал, что вы используете собственную функцию 'cgs'. Вероятно, вы хотите сделать это ясно в своем посте. – rayryeng

ответ

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 - номер итерации. Строкам требуется массив ячеек строк, где каждая ячейка находится в строке, поэтому мне пришлось немного обмануть.

Смежные вопросы