- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从 B 列和 C 列的两个输入近似值中得到 A 列的名称
数据.csv
A; B; C
ALGOL;3.13614789;40.95564610
ALIOTH;12.90050072;55.95981118
ALKAID;13.79233003;49.31324779
以下代码适用于精确值:
fid = fopen('test.csv');
C = textscan(fid, '%s %s %s', 'Delimiter', ';');
fclose(fid);
val1 = input('Enter the first input: ', 's');
val2 = input('Enter the second input: ', 's');
if(find(ismember(C{2},val1)) == find(ismember(C{3},val2)))
output = C{1}{find(ismember(C{2},val1))}
else
disp('No match found!');
end
结果:
Enter the first input: 12.90050072
Enter the second input: 55.95981118
output =
ALIOTH
但是如何用 val1 和 val2 的近似值得到相同的结果呢?示例:val1= 13.001 和 val2 = 57.210 将给出 => "ALIOTH"
也许我必须使用 importdata 然后检查公差,但我不知道如何。有办法做到这一点吗?
最佳答案
我建议您不要以字符串形式读取数据,而是以 float 形式读取数据,即:
C = textscan(fid, '%s %f %f', 'Delimiter', ';', 'HeaderLines', 1);
这将使您能够执行数值比较。然后您可以计算搜索值与数据矩阵中每一行之间的距离(比如 Euclidean distance):
v = [val1, val2];
dist = sqrt(sum(bsxfun(@minus, [C{2:3}], v) .^ 2, 2));
然后您可以从 dist
中选择最小值(这将始终保证匹配):
tf = (dist - min(dist) < eps);
或选择低于特定阈值的值:
tol = 2; %// Tolerance of your choice
tf = (dist < tol);
生成的逻辑( bool )向量 tf
应该在匹配行的位置有“1”。
您可以通过编写将其转换为第一列中的实际值:
result = C{1}(tf)
此解决方案可以推广到数据中任意数量的 P 列。此外,假设您想在数据中搜索 v
的多个不同实例(假设 v
是一个 M×P 矩阵,其中 中的每一行v
是要匹配的不同实例):
vv = permute(v, [3 2 1]);
dist = permute(sqrt(sum(bsxfun(@minus, [C{2:end}], vv) .^ 2, 2)), [1 3 2]);
同样,您可以选择最小值,确保匹配:
tf = (abs(bsxfun(@minus, dist, min(dist))) < eps);
或设置一个阈值:
tf = (dist < tol);
这里的tf
是一个M×N的逻辑矩阵(N是你数据中的总行数),其中每一列表示与v<中对应行匹配的数据行
.
要将其转换为第一列的值,您必须将输出存储在元胞数组中:
result = arrayfun(@(x)C{1}(tf(:, x)), 1:size(tf, 2), 'UniformOutput', false);
v = [13, 57.2; 13, 47]; %// Entries to search
vv = permute(v, [3 2 1]);
dist = permute(sqrt(sum(bsxfun(@minus, [C{2:end}], vv) .^ 2, 2)), [1 3 2])
tf = bsxfun(@minus, dist, min(dist)) < eps;
这导致:
tf =
0 0
1 0
0 1
表示v
的第一行匹配第二行数据,v
的第二行匹配第三行数据。要从第一个数据列中找到匹配值,我们这样做:
result = arrayfun(@(x)C{1}(tf(:, x)), 1:size(tf, 2), 'UniformOutput', false);
生成以下元胞数组:
result =
{ 'ALIOTH' }
{ 'ALKAID' }
关于具有公差的 Matlab 导入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16878731/
我正在尝试使用 Eigen 的 JacobiSVD 进行实验。特别是我试图从奇异值分解中重建输入矩阵。 http://eigen.tuxfamily.org/dox/classEigen_1_1Jac
我想知道 JodaTime 中是否有任何标准 API 来比较具有指定容差的 2 个 DateTime 对象?我正在寻找最好使用 Joda 标准 API 的单行代码。不适用于像 this post 中那
我是一名优秀的程序员,十分优秀!