【问题标题】:How to store .csv data and calculate average value in MATLAB如何在 MATLAB 中存储 .csv 数据并计算平均值
【发布时间】:2015-09-13 10:53:46
【问题描述】:

有人可以帮助我了解如何在 matlab 中保存一组 .csv 文件,仅选择我感兴趣的列并获得一个最终文件作为输出,其中我有 y 列的平均值和y轴的标准偏差?我在matlab中不太好,所以请问是否有人可以帮助我解决这个问题。

这是我到目前为止尝试做的事情:

     clear all;
clc;
which_column = 5; 
dirstats = dir('*.csv');
col3Complete=0;
col4Complete=0;
for K = 1:length(dirstats)

   [num,txt,raw] = xlsread(dirstats(K).name);
   col3=num(:,3);
   col4=num(:,4);
   col3Complete=[col3Complete;col3];
   col4Complete=[col4Complete;col4];
   avgVal(K)=mean(col4(:));
end
col3Complete(1)=[];
col4Complete(1)=[];
%columnavg = mean(col4Complete);
%columnstd = std(col4Complete);
% xvals = 1 : size(columnavg,1);
% plot(xvals, columnavg, 'b-', xvals, columnavg-columnstd, 'r--', xvals, columnavg+columstd, 'r--');

B = reshape(col4Complete,[5000,K]);
m=mean(B,2);
C = reshape (col4Complete,[5000,K]);
S=std(C,0,2);

现在我知道我应该使用 mean()function 在 for 循环中计算均值和标准偏差,但我不确定如何使用它。

【问题讨论】:

  • 你为什么使用xlsread 来处理 csv 文件?第二:初始化col3Complete=[],然后你就不必清除循环后的第一个条目。
  • 好的,现在我修改的代码可以运行了。我只需要了解如何计算标准差。
  • 与循环内计算mean的方法相同,只需使用std(col4(:))

标签: matlab csv average standard-deviation


【解决方案1】:
  which_column = 5; 
  dirstats = dir('*.csv');
  col3Complete=[]; % Initialise as empty matrix
  col4Complete=[];
  avgVal = zeros(length(dirstats),2); % initialise as columnvector
  for K = 1:length(dirstats)

     [num,txt,raw] = xlsread(dirstats(K).name);
     col3=num(:,3);
     col4=num(:,4);
     col3Complete=[col3Complete;col3];
     col4Complete=[col4Complete;col4];
     avgVal(K,1)=mean(col4(:)); % 1st column contains mean
     avgVal(K,2)=std(col4(:)); % 2nd column contains standard deviation
  end
  %columnavg = mean(col4Complete);
  %columnstd = std(col4Complete);
  % xvals = 1 : size(columnavg,1);
  % plot(xvals, columnavg, 'b-', xvals, columnavg-columnstd, 'r--', xvals, columnavg+columstd, 'r--');

  B = reshape(col4Complete,[5000,K]);
  meanVals=mean(B,2);

我没有做太多改变,只是将你的数组初始化为空数组,这样你就不必稍后删除第一个条目,并将avgVal 设为列向量,其平均值在第 1 列,标准差在第 1 列. 当然,如果您还想为 csv 中的第三列收集这些统计信息,您当然可以添加两列。

附带说明:xlsread 对于读取文件来说相当繁重,因为 Excel 效率极低。如果要读取csv等结构化文件,使用importdata会更快。

创建一些随机矩阵以存储在带有标题的文件中:

A = rand(1e3,5);
out = fopen('output.csv','w');
fprintf(out,['ColumnA', '\t', 'ColumnB', '\t', 'ColumnC',  '\t', 'ColumnD',  '\t', 'ColumnE','\n']);
fclose(out);
dlmwrite('output.csv', A, 'delimiter','\t','-append');

使用csvread加载它:

data = csvread('output.csv',1);

data 现在包含您的五列,没有任何标题。

【讨论】:

  • 非常感谢。我可以在同一行中使用 importdata 只需更改 xlsread 吗?对吗?
  • 不完全是。我没有你的 csv 文件,但总的来说importdata 在一个结构中为你提供了两件事,让我在答案中添加一个示例
  • 如何让您添加示例?无论如何,今天运行代码我收到此错误:尝试访问 num(:,3);索引超出范围,因为 size(num)=[0,0]。 csvBatchRead 中的错误(第 10 行)col3=num(:,3);
  • 这个例子在我的回答中,这是一个合适的地方。关于错误:我不确定,因为我没有您的文件,建议您阅读csvread 上的文档,这是dlmread 的包装,您也可以尝试。希望里面的东西能帮到你!
  • 现在可以了,谢谢。我的基本错误是我没有删除文件夹中的旧文件,所以我没有正确处理我的数据。我有第二个问题。如何正确地将这些数据复制到 excel 文件中?我使用了函数 xlswrite 但可能有问题。如果我写 xlswrite('file1.xlsx', m),例如,我无法看到在文件夹中创建的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多