我们说我在excel文件中有以下表格:
First row
142 15
second row
258 30
third row
789 35
我正在编写一个MATLAB脚本,该脚本首先提取数字789
(因为在同一文件的另一张表中找到了相同的数字)。现在,我还要提取与我的号码789
在同一行中的号码,但在第二列:这里是35
。
我一直在寻找一种方法来查找元素的索引,知道它的值。通过这种方式,我可以找到已知值789
的行和列,并使用它来提取相应的数字,35
。
以下是我用于在两张表中提取冗余号码的代码
firsttasks = xlsread('myfile1','Feuil1', 'A1:A3');
secondtaskes = xlsread('myfile1', 'Feuil2', 'A1:A3');
Lia = ismember(firsttaskes,secondtasks,'rows');
for i=1:3
if Lia(i) == 1
found = firsttasks(i);
end
end
答案 0 :(得分:0)
以下是此任务的一种解决方案:
firsttasks = xlsread('myfile1','Feuil1');
secondtaskes = xlsread('myfile1', 'Feuil2');
IDmatch = [(1:size(firsttasks,1))*bsxfun(@eq,firsttasks(:,1),secondtaskes(:,1).')
1:size(secondtaskes,1)];
IDmatch(:,IDmatch(1,:)==0) = [];
t = [firsttasks(IDmatch(1,:),1)...
abs(firsttasks(IDmatch(1,:),2)-secondtaskes(IDmatch(2,:),2))];
此处t(k,1)
是ID,t(k,2)
是此ID的时间差异。没有nan
,因为我们无法比较不匹配ID的值。
此解决方案不处理一个ID在工作表中存在两次或更多的情况,因为您没有定义在这种情况下发生的情况(如果可能)。
如何运作?
我们通过比较列表之间所有可能的ID组合来搜索2个列表之间的相等ID。这是通过函数bsxfun
完成的,该函数在两个输入上应用二元元素操作,同时扩展它们的单例维度以相互匹配。当这个函数的输入是两个向量时,大小为1乘m和n乘1,结果是m-by-n矩阵,其中每个元素是对不同元素组合的操作结果从两个向量。让我们看一个例子:
从excel导入数据后,它看起来像这样:
firsttasks =
142 15
258 30
789 35
76 32
94 15
46 48
32 97
secondtaskes =
142 23
258 76
789 34
46 75
32 21
67 48
使用ID firsttasks(:,1)
和secondtaskes(:,1)
的向量进行比较(请注意第二个向量是转置的),并得到以下输出:
>> bsxfun(@eq,firsttasks(:,1),secondtaskes(:,1).')
ans =
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 1 0 0
0 0 0 0 1 0
在此矩阵中,每个元素(i,j)表示firsttasks(i,1)
和secondtaskes(j,1)
中的ID匹配。
接下来,我们将firsttasks
的索引乘以此矩阵,以获得firsttasks
中匹配的行号,如果没有&#t; t,则为零:
>> (1:size(firsttasks,1))*bsxfun(@eq,firsttasks(:,1),secondtaskes(:,1).')
ans =
1 2 3 6 7 0
请注意,上面结果的索引代表secondtaskes
中的行,因此数字6表示secondtaskes
中的行 4 匹配行 6 < / strong>在firsttasks
中。现在我们将它们与secondtaskes
的索引垂直连接起来,所以我们将两个索引放在一起:
>> IDmatch = [(1:size(firsttasks,1))*bsxfun(@eq,firsttasks(:,1),secondtaskes(:,1).')
1:size(secondtaskes,1)]
IDmatch =
1 2 3 6 7 0
1 2 3 4 5 6
我们删除所有没有匹配的情况(即第一行中有零:
>> IDmatch(:,IDmatch(1,:)==0) = []
IDmatch =
1 2 3 6 7
1 2 3 4 5
我们将所有找到的ID都匹配:
>> firsttasks(IDmatch(1,:),1)
ans =
142
258
789
46
32
并将它们与第二列中相应值的所有差异水平连接:
>> abs(firsttasks(IDmatch(1,:),2)-secondtaskes(IDmatch(2,:),2))
ans =
8
46
1
27
76
所以我们得到:
>> t = [firsttasks(IDmatch(1,:),1)...
abs(firsttasks(IDmatch(1,:),2)-secondtaskes(IDmatch(2,:),2))]
t =
142 8
258 46
789 1
46 27
32 76
那就是它。