许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  matlab readmatrix与readtable对比及移植北太天元讨论

matlab readmatrix与readtable对比及移植北太天元讨论

阅读数 2
点赞 0
article_banner


在 MATLAB 中, 和  是用于读取数据文件(如 CSV 文件)的两种不同函数,它们的主要区别在于它们返回的数据类型和结构。当你有一个包含表头的 CSV 文件时,这两个函数的行为会有所不同。以下是它们的主要区别:

  • 功能:readmatrix 主要用于读取数值数据。它会自动检测文件中的数据类型,并尽可能将数据读取为数值矩阵。
  • 表头处理:如果 CSV 文件包含表头(headline),readmatrix 会默认跳过第一行,因为它假设第一行是文本描述而不是数据。
  • 返回类型:返回一个数值矩阵。如果文件中包含非数值数据(如文本字符串),readmatrix 可能会报错或将其处理为 NaN(具体行为取决于 MATLAB 版本和文件内容)。
  • 适用场景:适用于主要或完全由数值数据组成的文件,如纯数值的矩阵或数组。
  • 功能:readtable 用于读取表格数据,包括混合类型的数据(数值、字符串等)。
  • 表头处理:readtable 会将 CSV 文件的第一行作为表头(变量名),并据此创建表格的列名。
  • 返回类型:返回一个 table 类型的数据结构,其中每一列都可以是不同的数据类型(如数值、字符串、分类数据等)。
  • 适用场景:适用于包含混合数据类型的文件,尤其是当数据以表格形式组织时,如包含列名的数据表。

示例

假设你有一个 CSV 文件 ,内容如下:

代码块


Name,Age,Height
Alice,30,5.5
Bob,25,6.0
Charlie,35,5.8

      复制成功
     
     
     
     

  • 使用 readmatrix:
M = readmatrix('data.csv');
% M 将是一个 3x2 的数值矩阵(假设 'Name' 列被跳过或导致错误)
% M = [30, 5.5; 25, 6.0; 35, 5.8]; (实际行为可能因版本而异)

      复制成功
     
     
     
     

  • 使用 readtable:
  • 代码块
  • JavaScript
T = readtable('data.csv');
% T 将是一个包含三列(Name, Age, Height)的 table
% 你可以通过 T.Name, T.Age, T.Height 访问各列

      复制成功
     
     
     
     
  • 如果你只需要数值数据,并且文件中不包含重要的文本信息(如表头或字符串数据),可以使用 readmatrix。
  • 如果你的数据包含混合类型,或者你需要保留和利用表头信息,应该使用 readtable。

在北太天元(或其他类似环境中),如果你没有  函数但已经有了  数据结构和  函数,你可以通过手动处理 CSV 文件来实现类似  的功能。这通常涉及先读取整个文件内容,然后解析表头,并将数据分别存储到  的各列中。

下面是一个示例 M 函数,演示如何使用  和  数据结构来模拟  的功能:

代码块

JavaScript


function T = readtable(filename)
    % 打开文件并读取第一行作为表头
    fid = fopen(filename, 'rt');
    if fid == -1
        error('无法打开文件: %s', filename);
    end
    
    % 读取第一行作为表头
    headerLine = fgetl(fid);
    if ischar(headerLine)
        headers = strsplit(headerLine, ',');
        n_header = 1; 
    else
        error('文件没有表头行');
    end
    
    %做一个矫正,如果headers是"something", 把前后的双引号去掉
    for n=1:length(headers)
        if( length( headers{n} )>=2 )
            if(headers{n}(1) =='"') 
                headers{n}=headers{n}(2:end);
            end
            if(headers{n}(end) =='"') 
                headers{n}=headers{n}(1:end-1);
            end
            if(length(headers{n})==0) 
                headers{n}= ' '; 
            end
        end
    end
    
    % 关闭文件准备用 readmatrix 读取数据
    fclose(fid);
    
    % 使用 readmatrix 读取整个文件为字符串数组
    dataMatrix = readmatrix(filename, 'OutputType', 'string');
    
    % 获取行数和列数
    [numRows, numColumns] = size(dataMatrix);
    
    % 初始化 table 的各列
    cols = cell(1, numColumns);
    for i = 1:numColumns
        cols{i} = strings(numRows-n_header, 1); % 使用 strings 预分配
    end
    
    % 填充 table 数据
    for r = n_header+1:numRows
        for c = 1:numColumns
            cols{c}(r-n_header) = dataMatrix(r, c); % 从字符串数组中提取数据
        end
    end
    
    % 尝试将每列转换为合适的类型
    for c = 1:numColumns
        columnData = cols{c};
        allNumeric = true; % 假设所有元素都是数值
        
        % 手动检查每个元素是否可以转换为数值
        for r = 1:numRows-n_header
            num = str2double(columnData(r));
            if (isnan(num) &&  (~strcmpi(columnData(r),"NA") && ~strcmpi(columnData(r), "NAN")))  || ~isnumeric(num) % 检查转换是否成功
                allNumeric = false;
                break;
            end
        end
        
        if allNumeric
            % 如果所有元素都是数值,转换为 double 数组
            cols{c} = str2double(columnData);
        else
            % 保持为字符串类型
        end
    end
    
    % 创建 table
    T = table(cols{:}, 'VariableNames', headers);
end

      复制成功
     
     
     
     

说明

  1. 文件读取:首先,打开文件并读取第一行作为表头。
  2. 数据读取:使用 readmatrix 读取整个数据部分。这里假设 readmatrix 支持输出为 cell 数组,以便处理混合数据类型。如果不支持,你可能需要逐行读取文件并手动解析。
  3. 数据填充:将读取的数据填充到预分配的 cell 数组中。
  4. 类型转换:尝试将每列数据转换为数值类型(如果可能)。在实际应用中,你可能需要更复杂的逻辑来确定每列的正确数据类型。
  5. 创建 table:最后,使用 table 函数创建表格,并指定变量名。

还有北太天元暂时不支持table的花括号运算符.  

在 MATLAB 中, 是一种用于存储列变量类型数据的容器,类似于电子表格或 SQL 表。 的每一列可以包含不同类型的数据,例如数值、字符串、分类数据等。

使用花括号  运算符来访问  中的数据,可以获取单个单元格的内容。具体来说,花括号运算符用于提取  中某个特定行和列交叉点的单个值。这与使用圆括号  运算符不同,后者通常用于提取整列或整行的数据,返回的是一个数组或 。

示例

假设我们有一个 :

代码块

JavaScript


T = table([1; 2; 3], {'A'; 'B'; 'C'}, 'VariableNames', {'ID', 'Name'});

      复制成功
     
     
     
     

这个   看起来像这样:

代码块

JavaScript


ID    Name
    __    ____
    1     'A' 
    2     'B' 
    3     'C'
    
      复制成功
     
     
     
     

使用花括号  提取单个值

  • 提取第一行第二列的值:
  • 代码块
  • JavaScript
value = T{1, 'Name'}; % 或者 T{1, 2}

      复制成功
     
     
     
     

      这将返回 ,因为  的第一行第二列的值是 。

使用圆括号  提取整列或整行

  • 提取整列:
  • 代码块
  • JavaScript
columnData = T.Name; % 或者 T{:, 'Name'}(在某些上下文中)

      复制成功
     
     
     
     
  • 这将返回一个包含 'A', 'B', 'C' 的字符串数组。
  • 提取整行(通常使用 table 的行索引):
  • 代码块
  • JavaScript
rowData = T(1, :);

      复制成功
     
     
     
     

    这将返回一个包含第一行数据的 。

注意事项

  • 花括号 {}:用于提取单个单元格的内容,返回的是该单元格的实际数据类型(例如,数值、字符串等)。
  • 圆括号 ():用于提取整列或整行的数据,返回的是一个数组或 table。
  • 变量名访问:在访问 table 的列时,可以使用列名(如 T.Name)来简化代码,这通常比使用列索引(如 T{:, 2})更具可读性。

nansum 是MATLAB准备放弃的一个过时的函数,  目前北太天元也没有, 不过可以写一个m函数实现简单的情形下的nansum功能, 如针对一维或者二维的矩阵的nansum函数

代码块

JavaScript


function y = nansum(x, dim)
    % 检查输入参数的数量
    if nargin < 1
        error('nansum 需要至少一个输入参数。');
    end
    
    % 如果未指定维度,则默认对列求和
    if nargin < 2
        dim = 1;
    end
    
    % 处理空数组的情况
    if isempty(x)
        y = 0; % 对于空数组,返回0
        return;
    end
 
    % 检查是否为一维或二维数组
    if ndims(x) > 2
        error('此函数仅支持一维向量和二维矩阵。');
    end
 
    if dim == 1
        % 对列求和,返回行向量
        sz = size(x);
        y = zeros(1, sz(2));
        for i = 1:sz(2)
            y(i) = sum(x(~isnan(x(:,i)), i)); % 简化写法:y(i) = sum(x(~isnan(x(:,i))));
        end
    elseif dim == 2
        % 对行求和,返回列向量
        sz = size(x);
        y = zeros(sz(1), 1);
        for i = 1:sz(1)
            y(i) = sum(x(i, ~isnan(x(i, :)))); % 对每一行求和
        end
    else
        error('维度参数超出范围。');
    end
end

      复制成功
     
     
     
     



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空