'Find' 函数运行不正常,已尝试浮点精度解析
'Find' function working incorrectly, have tried floating point accuracy resolution
我已将目录中的文件垂直连接成一个大小约为 60000 x 15 的矩阵(已验证)。
d=dir('*.log');
n=length(d);
data=[];
for k=1:n
data{k}=importdata(d(k).name);
end
total=[];
for k=1:n
total=[total;data{n}];
end
我正在使用以下 32 次迭代循环和“查找”函数来定位行号,其中最后一列是与循环的整数迭代相对应的整数:
for i=1:32
v=[];
vn=[];
[v,vn]=find(abs(fix(i)-fix(total))<eps);
g=length(v)
end
我尝试通过对 'i' 的值和矩阵 'total' 的值使用 'fix' 来计算浮点精度,此外还计算了它们的绝对差值并进行了检查小于 'eps' 的公差(浮点相对精度函数),最大公差为 .99.
'Find' 函数无法正常工作。它仅适用于某些整数(尽管它应该定位所有整数 (1-32)),并且对于它确实发现值不完整的整数。
这里有什么问题?如果 'Find' 不足以满足此目的,什么是合适的替代方案?
你会得到很多零,因为你不仅要查看 data
的第 15 列,还要查看 整个数据矩阵 所以你将有一个很多非整数。
此外,您在两个数字上都使用了 fix
,并且由于浮点错误会导致数字略高于 并且 低于所需的整数,这将使下面的那些四舍五入 向下 一个比您预期的小的整数。您应该使用 round
来四舍五入到最接近的整数。
我不会使用 find
来执行此操作,而是使用简单的布尔逻辑来确定最后一列的值
for k = 1:32
% Compare column 15 to the current index
matches = abs(total(:,end) - k) < eps;
% Do stuff with these matches
g = sum(matches); % Count the matches
end
根据您实际要对数据执行的操作,您可以使用最后一列作为 accumarray
的输入以对每个组执行操作。
附带说明一下,您可以将第一段代码替换为
d = dir('*.log');
data = cellfun(@importdata, {d.name}, 'UniformOutput', false);
total = cat(1, data{:});
我已将目录中的文件垂直连接成一个大小约为 60000 x 15 的矩阵(已验证)。
d=dir('*.log');
n=length(d);
data=[];
for k=1:n
data{k}=importdata(d(k).name);
end
total=[];
for k=1:n
total=[total;data{n}];
end
我正在使用以下 32 次迭代循环和“查找”函数来定位行号,其中最后一列是与循环的整数迭代相对应的整数:
for i=1:32
v=[];
vn=[];
[v,vn]=find(abs(fix(i)-fix(total))<eps);
g=length(v)
end
我尝试通过对 'i' 的值和矩阵 'total' 的值使用 'fix' 来计算浮点精度,此外还计算了它们的绝对差值并进行了检查小于 'eps' 的公差(浮点相对精度函数),最大公差为 .99.
'Find' 函数无法正常工作。它仅适用于某些整数(尽管它应该定位所有整数 (1-32)),并且对于它确实发现值不完整的整数。
这里有什么问题?如果 'Find' 不足以满足此目的,什么是合适的替代方案?
你会得到很多零,因为你不仅要查看 data
的第 15 列,还要查看 整个数据矩阵 所以你将有一个很多非整数。
此外,您在两个数字上都使用了 fix
,并且由于浮点错误会导致数字略高于 并且 低于所需的整数,这将使下面的那些四舍五入 向下 一个比您预期的小的整数。您应该使用 round
来四舍五入到最接近的整数。
我不会使用 find
来执行此操作,而是使用简单的布尔逻辑来确定最后一列的值
for k = 1:32
% Compare column 15 to the current index
matches = abs(total(:,end) - k) < eps;
% Do stuff with these matches
g = sum(matches); % Count the matches
end
根据您实际要对数据执行的操作,您可以使用最后一列作为 accumarray
的输入以对每个组执行操作。
附带说明一下,您可以将第一段代码替换为
d = dir('*.log');
data = cellfun(@importdata, {d.name}, 'UniformOutput', false);
total = cat(1, data{:});