matlab输出fprintf函数的输出

想请教佬们一个问题

img

1.为什么输出的结果的每一行不是A1一个数和A2一个数,就是说像“X is 9.90 meters or 8.800000 mm”这样子,是因为对不齐吗
2.那如果第一行是对着的话,下面第二行为什么不是“X is 8.80 meters or 7.700000 mm”这样子

这个输出结果一点也看不懂,佬们知道应该再补学啥吗

  1. 因为此处调用的形式为fprintf(formatSpec,A1,...,An),即依据formatSpec中的格式,按顺序依次对A1、A2直到An进行输出。因此在实际使用中输出语句中变量只需要对数组内部的数据进行处理,而A1与A2通常情况下并没有实际关联,此时如果你将A1与A2顺序调换,那么输出情况也会相应发生顺序调整,如下例示例。
    % test
    A1 = [9.9,9900];
    A2 = [8.8,7.7;8800,7700];
    fprintf('先输出A1,再输出A2\n')
    fprintf('X is %4.2f meters or %9.3f mm\n',A1,A2)
    fprintf('先输出A2,再输出A1\n')
    fprintf('X is %4.2f meters or %9.3f mm\n',A2,A1)
    >>test
    先输出A1,再输出A2
    X is 9.90 meters or  9900.000 mm
    X is 8.80 meters or  8800.000 mm
    X is 7.70 meters or  7700.000 mm
    先输出A2,再输出A1
    X is 8.80 meters or  8800.000 mm
    X is 7.70 meters or  7700.000 mm
    X is 9.90 meters or  9900.000 mm
    
  2. 这与数据的遍历顺序有关系。要进一步了解这个问题前,还需要额外补充几个相关的基础点。首先是数组的构造。在matlab中,你可以通过A1 = [9.9,9900]; A2 = [8.8,7.7;8800,7700];这种方式来构造数组A1、A2,具体地,当数字间分格为,或者空格时,数据则按照行方向上进行排列。当间格为;时,则是按照列方向上排步。因此示例中A2的数组存储形式如下图所示。

    img

在构造数组时除了方向以外,还需要注意输入数据满足矩阵形式,否则会格式出错。如果你对矩阵的行列方向需要调整转换,那么进行矩阵转置操作即可。
接下来还有一个基础点,就是矩阵数据读取的顺序。在matlab中,矩阵数据即数组的读取均是按照“列序优先”的策略,即按照列的方向优先读取数据,随后才按照行方向依次展开读取。因此对于示例A2中的数据,其读取的顺序分别为8.8,8800,7.7,7700,按照顺序输入fprintf中后就如图中所示按顺序输出。假如你希望按照行方向进行依次输出,则需要对数组进行转置,从而保证正确的读取形式,如:

% test2
A2 = [8.8,7.7;8800,7700];
fprintf('X is %4.2f meters or %9.3f mm\n',A2') % A2'A2的转置
>> test2
X is 8.80 meters or     7.700 mm
X is 8800.00 meters or  7700.000 mm

同时,对于fprintf这样的函数处理方式,这里引申出新的疑问,比如我的输入变量是否需要按照formatSpec中设置的格式化操作符数量去规整格式?如示例中formatSpec包含了2个格式化操作符,理论上需要2行n列的数据进行输入。但假如我只有n行1列的数据,那么能够输入吗?如果我输入了5个数据进去,程序会怎么样?进一步地,假设我输入了多个变量,这其中存在不规范的数组,那么这对于输出又会有什么样的影像呢?以下进行示例。

% test3
A3 =[9.9,8.8,7.7,6.6,5.5]; A4 = [9.8;8.7];
fprintf('X is %4.2f meters or %9.3f mm\n',A3,A4)
>> test3
X is 9.90 meters or     8.800 mm
X is 7.70 meters or     6.600 mm
X is 5.50 meters or     9.800 mm
X is 8.70 meters or >> 

示例中,A3为一行5列的数组,A4为2行1列的数组。可以看到,当首先处理A3数组时,fprintf依然能够正常读取数组内的数据。因此可以得出结论,fprintf的函数读取变量不与变量的数组结构有关系,数据结构只影响读取顺序。此外,fprintf一次完整输出中需要2个数字数据,但是只有5个数字数据的A3进行最后一个数的输出时并没有中断,而是将A4中第一个数据作为后一个的输入和输出,这得到第二个结论:当前一组数据数据量不支持全部输出时,后一组的数据会继续补充。此外,可以看到在输出A4的最后一个数时,缺少输入,程序虽然并未因此停止报错,但是停止在了第二个变量输入。在日常使用时,为了程序的正常运行,还是需要注意规范一下输入数据的格式,以方便后续的处理。
希望回答能有所帮助。

你这个fprintf函数中,前面只有两个指定输出,所以将按两个两个的顺序依次输出。A1排在前面,且只有两个数,所以先把A1中所有的数输出。然后,因为matlab矩阵是默认按列排序的,所以A2中数的顺序其实是1 3;2 4,所以两个两个依次输出的顺序为8.8,8800,9.9,9900。
码字不易,有用希望采纳一下哦~