2012-12-24 124 views
0

我正在MATLAB的迭代程序(雅可比迭代法解决甲X = b),它允许我作N次迭代。MATLAB:打印格式的表

到目前为止,我可以编写迭代,但我想改进结果的表示。

我的程序的输出:的x

jacobi(A, b, 20); %N = 20 iterations 

值通过迭代(或多个)(从0开始)的列从左至右:

X = 

列1至9

 0 3.4000 -0.0556 1.3848 1.0250 0.9300 1.0558 0.9813 1.0034 
    0 4.0000 0.8603 2.1810 2.0329 1.9030 2.0453 1.9826 1.9997 
    0 2.5000 4.5444 2.1023 3.3195 2.9782 2.9513 3.0402 2.9831 
    0 2.0000 5.3463 3.5175 4.0772 4.0612 3.9463 4.0266 3.9939 
    0 6.7778 3.8111 5.4106 4.9648 4.9366 5.0513 4.9777 5.0046 

第10列至第18列

1.0026 0.9979 1.0011 0.9998 1.0000 1.0001 1.0000 1.0000 1.0000 
2.0027 1.9977 2.0008 1.9998 1.9999 2.0001 2.0000 2.0000 2.0000 
3.0035 3.0013 2.9984 3.0009 2.9998 3.0000 3.0001 3.0000 3.0000 
3.9990 4.0022 3.9988 4.0004 4.0000 3.9999 4.0001 4.0000 4.0000 
5.0015 4.9979 5.0011 4.9997 5.0000 5.0001 5.0000 5.0000 5.0000 

列19至21

1.0000 1.0000 1.0000 
2.0000 2.0000 2.0000 
3.0000 3.0000 3.0000 
4.0000 4.0000 4.0000 
5.0000 5.0000 5.0000 

没关系,如果你们从来没有听说过这种方法,但我想知道,如果我要插入的字符串,使其成为

jacobi(A, b, 20); 

值的x按迭代(从0开始)从左至右的列:

X =

列1至9

iteration 
    ---------------------------------------------------------------------------------- 
     0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |  8 
    ---------------------------------------------------------------------------------- 
     0 3.4000 -0.0556 1.3848 1.0250 0.9300 1.0558 0.9813 1.0034 
     0 4.0000 0.8603 2.1810 2.0329 1.9030 2.0453 1.9826 1.9997 
     0 2.5000 4.5444 2.1023 3.3195 2.9782 2.9513 3.0402 2.9831 
     0 2.0000 5.3463 3.5175 4.0772 4.0612 3.9463 4.0266 3.9939 
     0 6.7778 3.8111 5.4106 4.9648 4.9366 5.0513 4.9777 5.0046 

等等,我究竟该怎么办?

我正在考虑在下面插入------ up,i | middle和------以及循环中的迭代次数,以使它产生多达所需的N次。

到目前为止,我已经在搜索中发现的最接近的例子,是

arrayfun(@(x)sprintf('Hole %j',x), 1:18)','UniformOutput',false) 

不过,我仍然无法弄清楚如何将这一想法变成我的代码。这种输出可能在MATLAB中吗?

任何人都可以帮助我吗?提前致谢。

我正在学习MATLAB课程,但只用了几个月的课时,我没有学到很多东西。但我正在寻找一个挑战。

回答

3

你并不需要为矩阵本身添加字符串。

这是当显示格式结果是所有问题的。举例来说,你可以去下面的解决方案,它采用fprintf和一些字符串格式(没有循环!):

% # Initialize table properties 
col_w = 11; % # Fixed column width in characters 
fr_n = 4; % # Number of fraction digits 

% # Print header 
hdr_line = repmat(['+', char('-' * ones(1, col_w))], 1, size(X, 2)); 
hdr_fmt = ['|%', int2str(col_w - fr_n - 1)', '.0f', char(' ' * ones(1, fr_n + 1))]; 
fprintf('Iteration:\n%s\n', hdr_line) 
fprintf(hdr_fmt, 0:size(X, 2) - 1) 
fprintf('\n%s\n', hdr_line) 

% # Print values 
data_fmt = [repmat(['|%', int2str(col_w - 1), '.', int2str(fr_n), 'f '], 1, size(X, 2)), '\n']; 
fprintf(data_fmt, X') 

这里X表示要打印的矩阵(不要忘记在移调X最后一行!)。
样品输出col_w = 10fr_n = 4

Iteration: 
+----------+----------+----------+----------+----------+----------+----------+----------+---------- 
| 0  | 1  | 2  | 3  | 4  | 5  | 6  | 7  | 8  
+----------+----------+----------+----------+----------+----------+----------+----------+---------- 
| 0.0000 | 3.4000 | -0.0556 | 1.3848 | 1.0250 | 0.9300 | 1.0558 | 0.9813 | 1.0034 
| 0.0000 | 4.0000 | 0.8603 | 2.1810 | 2.0329 | 1.9030 | 2.0453 | 1.9826 | 1.9997 
| 0.0000 | 2.5000 | 4.5444 | 2.1023 | 3.3195 | 2.9782 | 2.9513 | 3.0402 | 2.9831 
| 0.0000 | 2.0000 | 5.3463 | 3.5175 | 4.0772 | 4.0612 | 3.9463 | 4.0266 | 3.9939 
| 0.0000 | 6.7778 | 3.8111 | 5.4106 | 4.9648 | 4.9366 | 5.0513 | 4.9777 | 5.0046 
+1

+1,还有'+'符号在哪里交叉。 LoL – Acorbe

+0

%#打印标题
hdr_line = repmat(['+',char(' - '* ones(1,10))],1,size(X,2));
fprintf('Iteration:\ n%s \ n',hdr_line)
fprintf('|%5.0f',0:size(X,2) - 1)
fprintf('\ n%s \ n 'hdr_line)
%#打印值
fprintf中([repmat( '|%9.4f',1,尺寸(X,2)), '\ n'],X')
哇人这真棒!
我在程序结束时添加了该命令,但数字未对齐,并且当迭代太长时间后,它不会继续显示。
我试着把我的代码放在这里,但是显示不好。
我很感激! :) – Wal

+0

哦,男人,我甚至无法正确格式化我的意见! >。< – Wal

0

首先需要注意的是,命令窗口并非真正用于定制输出。如果你想在每列上方显示一个数字的表格,变量查看器(通过双击工作区中的一个变量打开)可以实现这个功能。

但是,如果要在计算仍处于活动状态时打印结果,则可以查看其中的一个:Printing a formatted Table。答案是here

+0

感谢的人,我会尝试看看it.Yeah,我希望它打印出来与花哨的列线的结果。 但第一个链接的列固定。我想知道如何让它像C++一样在循环中打印出来,作为答案显示在命令窗口中。 – Wal