提问人:romanex 提问时间:12/4/2016 更新时间:12/4/2016 访问量:36
“查找”功能工作不正确,已尝试浮点精度分辨率
'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。
“查找”功能无法正常工作。它只适用于某些整数(尽管它应该定位所有整数 (1-32)),而对于整数,它确实发现值不完整。
这里有什么问题?如果“查找”不足以达到此目的,那么合适的替代方案是什么?
答:
2赞
Suever
12/4/2016
#1
你得到很多零,因为你不仅要看第15列,还要看整个数据矩阵,所以你会有很多非整数。data
此外,您同时使用这两个数字,并且由于浮点错误可能导致数字略高于和低于所需的整数,这将导致低于您预期的整数向下舍入一个整数。您应该改用舍入到最接近的整数。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{:});
评论
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
我使用了您的串联版本,以及循环的浮点友好版本,看起来它有效。非常感谢
上一个:实现朴素贝叶斯分类器的准确率低
评论
find
total(:)
total