2016-09-06 11 views
1

私は必要な値をすべて出力し、各値はcondACGSorthです。しかし、私はそれらをカラム名としてcondACGSorthという素敵なテーブルに配置し、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

MATLABから 'cgs'を使用していますか?もしあなたがそうであれば、 'cgs'ステートメントは不完全です。これは、共役勾配法を使用して、方程式の線形システムを解く際に右辺のベクトル「b」を必要とします。このコードを実行可能にするために編集してください。 – rayryeng

+0

@rayryengいいえcgsは私自身の機能でした。今私はそれをqr()と言うだけに変更しました。コードは実行する必要がありますが、適切な値は与えません。ありがとう。 – jchaykow

+0

問題ありません。私はあなた自身の 'cgs'関数を使っていたことを知らなかったので、これを元に戻すことができます。あなたはおそらくあなたのポストでそれを明確にしたいと思う。 – rayryeng

答えて

3

を次のように定義された自分のCGS()関数を使用しています。すべての結果を行列に保存し、行列を表に変換して必要なヘッダーを追加することができます。

最初に、列の総数が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を使用して、表示される精度の桁数を増やしました。また、これらの数値は、反復ごとに(randnを介して)行列Aのランダム化された性質のため、このスクリプトの呼び出しごとにわずかに変更されることにも注意してください。追加ボーナスとして、あなたはこのテーブルに行名を追加し、それぞれの結果生成されたものを反復表示することができます:私は、各セルに文字列を持っている文字列のセル配列を作成するためのundocumented function sprintfcを使用

>> 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 

注意しIteration iここで、iは反復番号です。行には文字列のセル配列が必要ですが、各セルは行ごとに配置されているため、ちょっと騙さなければなりませんでした。

関連する問題