gpt4 book ai didi

具有公差的 Matlab 导入数据

转载 作者:行者123 更新时间:2023-12-02 05:02:20 24 4
gpt4 key购买 nike

我想从 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 !

我建议您不要以字符串形式读取数据,而是以 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com