在 MATLAB 中, 和 是用于读取数据文件(如 CSV 文件)的两种不同函数,它们的主要区别在于它们返回的数据类型和结构。当你有一个包含表头的 CSV 文件时,这两个函数的行为会有所不同。以下是它们的主要区别:
假设你有一个 CSV 文件 ,内容如下:
代码块
Name,Age,Height
Alice,30,5.5
Bob,25,6.0
Charlie,35,5.8
复制成功
M = readmatrix('data.csv');
% M 将是一个 3x2 的数值矩阵(假设 'Name' 列被跳过或导致错误)
% M = [30, 5.5; 25, 6.0; 35, 5.8]; (实际行为可能因版本而异)
复制成功
T = readtable('data.csv');
% T 将是一个包含三列(Name, Age, Height)的 table
% 你可以通过 T.Name, T.Age, T.Height 访问各列
复制成功
在北太天元(或其他类似环境中),如果你没有 函数但已经有了 数据结构和 函数,你可以通过手动处理 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
复制成功
还有北太天元暂时不支持table的花括号运算符.
在 MATLAB 中, 是一种用于存储列变量类型数据的容器,类似于电子表格或 SQL 表。 的每一列可以包含不同类型的数据,例如数值、字符串、分类数据等。
使用花括号 运算符来访问 中的数据,可以获取单个单元格的内容。具体来说,花括号运算符用于提取 中某个特定行和列交叉点的单个值。这与使用圆括号 运算符不同,后者通常用于提取整列或整行的数据,返回的是一个数组或 。
假设我们有一个 :
代码块
JavaScript
T = table([1; 2; 3], {'A'; 'B'; 'C'}, 'VariableNames', {'ID', 'Name'});
复制成功
这个 看起来像这样:
代码块
JavaScript
ID Name
__ ____
1 'A'
2 'B'
3 'C'
复制成功
value = T{1, 'Name'}; % 或者 T{1, 2}
复制成功
这将返回 ,因为 的第一行第二列的值是 。
columnData = T.Name; % 或者 T{:, 'Name'}(在某些上下文中)
复制成功
rowData = T(1, :);
复制成功
这将返回一个包含第一行数据的 。
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
复制成功
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删