【问题标题】:Read file and use for-loop to get a product of each line in Matlab读取文件并使用for循环获取Matlab中每一行的乘积
【发布时间】:2016-10-03 22:38:46
【问题描述】:

我正在创建一个脚本,它将读取一个包含数字的文本文件,我们称之为“numbers.txt”:

1234
20324
221
etc.

我想将文本文件中的第一个数字与第二个数字相乘并减去 1,第二个与第三个数字相乘,以此类推,直到在每个步骤中将整数相乘并减去 1。问题是当它运行时,它会输出它得到的所有值,而我只想要每行的最终产品并将其放入一个变量中。我该怎么做?

这是我的代码:

fid = fopen('numbers.txt');
     while ~feof(fid);
     fgetlfid = fgetl(fid);
     c = 1;
         for i = fgetlfid;
          c = i*c-1   
          end
     end

【问题讨论】:

  • 你应该在c = i*c-1 后面加一个分号来禁止输出。然后在最后放一个disp(c),显示最终值
  • 感谢您的回复!我已经这样做了,但这也显示了每个数学运算的输出,而我只需要每行的最后一个(该行上的所有数字都乘以和减去 1)
  • 几个问题:1)文件中的所有数字都是正整数吗? 2) 整个文件是否可以立即放入内存?如果是这样,您也许可以使用 dlmreadtextscan 等(A = dlmread('numbers.txt');fID = fopen('numbers.txt'); B = textscan(fID,'%u'); B = B{1}; fclose(fID);)来加载它
  • 它只是正整数,它们都适合内存。
  • @anters - 上面的实现与您的描述略有不同。第一步应该是第一个数字乘以 1 并减去 1(如您的代码)还是第一个数字乘以第二个数字并减去 1(如您的描述)?

标签: matlab for-loop while-loop


【解决方案1】:

您的问题有几个方面:

  • 读取文本文件 - 查看 Dev-iL 在 cmets 中的建议,将完整文件读入内存而不是使用 fgetl
  • 将一串数字解析为数字向量 - 读入文本文件后,需要将字符串(例如 '1234')转换为向量(例如 [1 2 3 4 ])。
  • 计算您的问题中描述的总和 - 这似乎是您问题的症结所在,因此我将在下面重点介绍这一点。

对于字符串abcd,其中 a、b、c 和 d 是 0 到 9 之间的整数,您描述的总和计算如下:

( ( (a - 1) * b - 1 ) * c - 1 ) * d - 1

这可以扩展为:

a*b*c*d - b*c*d - c*d - d - 1

图案清晰。对于任何介于 0 到 9 之间的整数向量x,可以通过以下方式以向量化方式计算总和:

temp = flip( cumprod( flip( x ) ) );
result = temp(1) - sum( temp(2:end) ) - 1

例如:

>> x = [ 1 2 3 4 ];
>> temp = flip( cumprod( flip( x ) ) )

temp =

    24    24    12     4

>> result = temp(1) - sum( temp(2:end) ) - 1

result =

   -17

以矢量化的方式将其应用于整个文件有点棘手,因为您可以拥有不同长度的字符串。您可以通过一些创造性地使用 NaN 填充字符串来做到这一点,以便每一行的长度相同。同样,我只关注您问题的实质,其余的由您决定。

【讨论】:

    猜你喜欢
    • 2014-08-11
    • 2016-07-08
    • 2011-12-21
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多