“查找”功能工作不正常,尝试过浮点精度分辨率

时间:2016-12-04 04:25:30

标签: matlab floating-accuracy

我将目录中的文件垂直连接成一个大小约为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次迭代循环和“Find”函数来定位行号,其中最后一列是对应于循环的整数迭代的整数:

for i=1:32
    v=[];
    vn=[];
    [v,vn]=find(abs(fix(i)-fix(total))<eps);
    g=length(v)
end

我试图通过对'i'的值使用'fix'和使用矩阵'total'的值来解释浮点精度,此外还要考虑它们的绝对差值并检查它是否小于' eps'(浮点相对精度函数),最大公差为.99。

“查找”功能无法正常工作。它仅适用于某些整数(尽管它应该定位所有整数(1-32)),对于整数,它确实发现值不完整。

这是什么问题?如果“查找”不足以达到此目的,那么什么是合适的替代方案?

1 个答案:

答案 0 :(得分:2)

你得到了很多零,因为你不只是在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{:});