【问题标题】:storing day to day data from matrix in another matrix octave / matlab将矩阵中的日常数据存储在另一个矩阵八度/ matlab中
【发布时间】:2021-05-09 20:47:44
【问题描述】:

我有这个大约 80 万行的巨大矩阵。 (这只是一小部分,因此您可以看到它是如何制作的)每天,全年每个月,城市周围大约 7 个收费站的 24 小时数据。我需要在一个新的矩阵中存储有多少汽车以现金支付,有多少人使用了电子收费设备,每天,365 天,然后绘制整个事情。在这种情况下,我不必区分通行费,所以我知道我需要第 1,2 8 和 9 列。101 表示现金和 106 通行费,但老实说,我不知道如何操作这么大矩阵,我对使用 octave/matlab 和一般编程有点新,所以非常感谢您的任何建议

#Month  Day Hour    weekday(1to7)   TollStation Direction   Vehicle type    method of payment   Amount of vehicles
1   1   0   3   1   1   1   106 6
1   1   0   3   1   2   1   106 18
2   4   0   3   2   1   1   101 16
2   5   0   3   2   1   1   106 159
3   17  0   3   2   1   2   106 5
4   15  0   3   2   2   1   101 12
5   19  0   3   2   2   1   106 182
6   1   0   3   3   1   1   106 98
7   1   0   3   3   1   2   106 6
8   1   0   3   3   2   1   106 67
9   1   0   3   3   2   2   106 6
10  1   0   3   4   1   1   106 59
11  1   0   3   4   1   2   106 1
12  1   0   3   4   2   1   106 106

编辑: 我像这样打开文件:

file=fopen('FlujoVehicular2019.txt'); %open file
arreglo=fscanf(file, '%i',[9,812513]); %reads file
fclose(file); %close file
M = arreglo';

[nRow, ~] = size(M);


elec_rows=find(M(:,1)==1 & M(:,2)==1 & M(:,8)==10); %filters month 1, day 1 electronic payments

>a = sum(M(elec_rows,9)); %sums all electronic payments from month 1 day 1

>disp(a)

现在我需要将这些数据存储在某个地方,然后转到第 1 个月第 2 天、第 1 个月第 3 天等等。我怎样才能做到这一点?再次感谢

【问题讨论】:

  • 这个存储在哪里? Excel 文件,文本,.txt 文件?
  • @MichaelTr7 它是一个 txt 文件,所有数字,没有字符串或其他任何内容。我制作的excel文件只是为了检查结果。

标签: matlab loops matrix octave


【解决方案1】:

所以,800k x 9 很大,但不是“那么大”。 Matlab/Octave 处理这么多数据应该没什么问题。

例如 - 在 Octave 上,创建一个随机的 800,000 x 9 数组:

>> a = rand(800000,9);

>> whos 
Variables visible from the current scope:

variables in scope: top scope

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        a      800000x9                   57600000  double

Total is 7200000 elements using 57600000 bytes

没有花费多少时间。但是,将数据作为文本保存到磁盘,使用

>> csvwrite('testdata.dat', a);

>> b = csvread('testdata.dat');

创建了一个 135MB 的文件,每个文件都需要几分钟。还是很能驾驭的。还有一些文件 i/o 函数可能比我上面使用的更快。

所以第 1 步是读入您的数据。有许多功能可以做到这一点,请参阅Octave manual on Simple File I/O。使用这些简单函数的主要问题是您的标题行,并且从您粘贴的数据中,它有多个字符作为空格。如果它是单个空格、制表符或逗号,那就很简单了。以下工作,使用dlmread 和一个空输入[] 作为分隔符,以便函数自己计算出来,并指定跳过数据的 1 行和 0 列:

>> mydata = dlmread('testdata2.txt',[], 1, 0);  
warning: implicit conversion from null_matrix to sq_string
mydata =

     1     1     0     3     1     1     1   106     6
     1     1     0     3     1     2     1   106    18
     2     4     0     3     2     1     1   101    16
     2     5     0     3     2     1     1   106   159
     3    17     0     3     2     1     2   106     5
     4    15     0     3     2     2     1   101    12
     5    19     0     3     2     2     1   106   182
     6     1     0     3     3     1     1   106    98
     7     1     0     3     3     1     2   106     6
     8     1     0     3     3     2     1   106    67
     9     1     0     3     3     2     2   106     6
    10     1     0     3     4     1     1   106    59
    11     1     0     3     4     1     2   106     1
    12     1     0     3     4     2     1   106   106

(警告只是关于它处理分隔符的空输入。同样,使用更简单的分隔符会更清晰。)还有其他函数也可以工作,包括定义函数识别的输入模式,但dlmread 似乎可以解决问题。

在将数据读入程序后,一旦您了解了如何使用不同的函数以及 matlab/octave 如何处理索引和逻辑运算符以提取数据子集,您所说的许多其他事情都是相当简单的数据操作。使用整个 800k 行数据集与使用上面包含的小数据集没有什么不同。

举个例子 - 获取每月支付现金或电子支付的汽车数量:

>> elec_rows=find(mydata(:,8)==106)
elec_rows =

    1
    2
    4
    5
    7
    8
    9
   10
   11
   12
   13
   14

>> cash_rows=find(mydata(:,8)==101)
cash_rows =

   3
   6

>> sum(mydata(elec_rows,9))
ans = 713

>> sum(mydata(cash_rows,9))
ans = 28

还有一个绘图示例:

>> plot(mydata(elec_rows,1), mydata(elec_rows,9), mydata(cash_rows,1), mydata(cash_rows,9));
>> xlabel('month');ylabel('cars');title('cars per month');
>> legend('electronic payment', 'cash payment');

(第 1 个月不太合适,因为第 1 个月有两个电子支付条目,但在绘图之前,您可以做不同的事情来按月汇总数据等。

【讨论】:

  • 尼克,感谢您花时间回答我。我像这样打开文件:file=fopen('FlujoVehicular2019.txt'); %open file arreglo=fscanf(file, '%i',[9,812513]); %读取文件 fclose(file); %关闭​​文件 M = arreglo'; [nRow, ~] = 大小(M); elec_rows=find(M(:,1)==1 & M(:,2)==1 & M(:,8)==106); %filters 第 1 个月,第 1 天电子支付 a = sum(M(elec_rows,9)); %sums 从第 1 个月第 1 天开始的所有电子支付 disp(a) 现在我需要将这些数据存储在某个地方,然后转到第 1 个月第 2 天,依此类推。我怎样才能做到这一点?再次感谢
  • 当你说“存储在某处”是什么意思?
猜你喜欢
  • 2015-12-28
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2015-08-08
  • 2013-11-18
  • 2021-08-28
  • 1970-01-01
  • 2019-06-27
相关资源
最近更新 更多