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

'Find' function working incorrectly, have tried floating point accuracy resolution

提问人:romanex 提问时间:12/4/2016 更新时间:12/4/2016 访问量:36

问:

我已将目录中的文件垂直连接成一个大小约为 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。

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

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

MATLAB 浮动精度

评论

3赞 Suever 12/4/2016
我要在这里说它工作得很好,你误解了它是如何工作的。可能值得备份并告诉我们您实际想做什么,因为不清楚。find
0赞 romanex 12/4/2016
矩阵的第 15 列是唯一整数值介于 1-32 之间的列,因此,find 函数应返回向量“v”,其中行号归因于所讨论的特定整数(vn 无关紧要)。输出显示,对于许多不应为零的整数,v 的长度为零。我需要使用向量“v”来定位行号,从中我可以从矩阵“total”中的不同列中获取相应的数据。这能解决问题吗?
0赞 O'Neil 12/4/2016
您可能希望按原样编写 60000 x 15。此外,您可以在第一个代码中使用 cell2mattotal(:)total

答:

2赞 Suever 12/4/2016 #1

你得到很多零,因为你不仅要看第15列,还要看整个数据矩阵,所以你会有很多非整数。data

此外,您同时使用这两个数字,并且由于浮点错误可能导致数字略高于低于所需的整数,这将导致低于您预期的整数向下舍入一个整数。您应该改用舍入到最接近的整数。fixround

我不会使用简单的布尔逻辑来确定最后一列的值,而是使用简单的布尔逻辑来执行此操作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{:});

评论

0赞 romanex 12/4/2016
您在第一个代码块中发布的解决方案不适用于整数:2,3,5,6,7,8,9,10,12,13,16,17,20,23,25,26,29,30,31
0赞 romanex 12/4/2016
我使用了您的串联版本,以及循环的浮点友好版本,看起来它有效。非常感谢