MATLAB:从读取并放入单元格的csv文件制作直方图?

Posted

技术标签:

【中文标题】MATLAB:从读取并放入单元格的csv文件制作直方图?【英文标题】:MATLAB: making a histogram plot from csv files read and put into cells? 【发布时间】:2018-11-09 12:28:08 【问题描述】:

很遗憾,我不是太精通技术,只有基本的 MATLAB/编程背景...

我在一个文件夹中有几个 csv 数据文件,并且想同时制作所有这些文件的直方图以便比较它们。我不知道该怎么做。网上一些挖掘给出了一个脚本:

d=dir('*.csv'); % return the list of csv files for i=1:length(d) mi=csvread(d(i).name); % put into cell array end

问题是我现在不能简单地编写histogram(m(i)) 命令,因为 m(i) 是一种单元格类型而不是 csv 文件类型(我不确定我是否正确使用了这个术语,但 MATLAB 绝对不是接受前者)。

我不太确定如何进行。事实上,我不确定元素 m(i) 的本质是什么,以及我能/不能用它们做什么。 histogram 命令需要一个矩阵输入,所以大概我需要一个“矩阵向量”和一个在单独的图中绘制每个向量元素(即矩阵)的命令。我总共有大约 14 个,这相当多并且需要很长时间才能加载,但我不确定如何更有效地进行。

概括问题:

稍后我将编写一个脚本来减少噪音并平滑 csv 文件中的数据,并将其二值化(csv 文件适用于形状模糊的嘈杂图像,我想通过设置剪切来区分这些形状off 用于 csv 矩阵中的像素强度/值,例如创建显示这些形状的二进制图像)。理想情况下,我想一次将其应用于我文件夹中的所有图像,这样我就可以转移出哪些图像最适合分析。所以我的问题是,我怎样才能运行一个包含我文件夹中所有 csv 文件的脚本,以便我可以一次比较它们?我认为我用于直方图的任何技术也适用于此,但我不确定。

编写一个脚本可能会更好: - 为文件夹中的每个 csv 文件制作直方图和/或运行二值化脚本 - 并将所有图像放入一个新的指定文件夹中,这样我就可以筛选这些。

我将非常感谢有关如何执行此操作的指示。正如我所提到的,我对编程很陌生,在查看建议时会感到不知所措,看到各种不同的命令显然可以实现相同的目的——一次读取多个文件。

【问题讨论】:

【参考方案1】:

函数csvread 本身返回一个矩阵。我不确定,但如果csv 文件中的某些元素不是数字,Matlab 会自动从输出中生成一个元胞数组。由于我不知道您的 csv 文件的结构,我建议您尝试一些类似的功能(readtablexlsread):

M = readtable(d(i).name) % Reads table like data, most recommended

M = xlsread(d(i).name) % Excel like structures, but works also on similar data

试一试,让我知道它是否有效。如果不是,请上传文件示例。

【讨论】:

您好 Pablo,感谢您的回复。我认为将 csvread 读入单元数组是不必要的,尽管我可能对此非常错误。老实说,我不太确定创建单元阵列的效用。我想要处理的只是 csv 文件,所以只保留结构 d 肯定不会有什么坏处,并且对于每个 d(i) 运行 M= csvread(d(i).name),将我的代码应用于M 并将我需要的内容保存到另一个文件中,然后对下一个 i 执行相同操作?我对数据类型感到相当困惑,例如在我原来问题的代码中,m 的元素被称为“单元格” 但它们是我目录中的 csvread 文件?如何从“单元格”转到 csv 中的值矩阵,这是我需要将后续代码应用到的地方? 我的建议是阅读矩阵M 并将其存储在矩阵中(当时是3D),然后继续。如果不是关键,我不会使用细胞。它们不如矩阵有效,并且与大括号和普通括号有点混淆。 请上传您拥有的一个小 csv 文件的屏幕截图以及 csvread @21joanna12 如何读取它【参考方案2】:

函数csvread(filename) 总是返回作为数值矩阵的矩阵 M,并且永远不会将单元格作为返回值。 如果您在 .csv 文件中有文本数据,它会给您一个错误,因为没有数字数据。我在读取文件时看到使用元胞数组的唯一原因是,如果从每个文件中读取的单个矩阵的维度不同,例如第一个 .csv 文件包含组织为 3xA 的数据,第二个 .csv 文件包含组织为的数据2xB,因此您可以将它们全部放在一个结构中。

但是,仍然可以在单元格数组上使用直方图,方法是将元素提取为数组而不是将其提取为单元格元素。

如果M 是一个单元矩阵,则有两种提取数据的选项: M(i)MiM(i) 会给你单元格元素,不能用于histogram,但是Mi 会以其初始形式返回元素,即数字矩阵。

TL;DR 使用 histogram(Mi) 而不是 histogram(M(i))

【讨论】:

以上是关于MATLAB:从读取并放入单元格的csv文件制作直方图?的主要内容,如果未能解决你的问题,请参考以下文章

关于VB.NET的CSV文件的读取

如何从python中找到.csv文件中特定单元格的平均值?

怎样从matlab中读取csv文件

macmatlab导入大型csv

如何从 Matlab 中的 .mat 文件中仅加载一个单元格的条目?

用matlab读取一个csv表格文件并输出函数图像