如何减去不同大小的向量中的值并使用min进行查找

时间:2018-03-30 22:39:56

标签: matlab image-processing

我有两个.txt文件,我已将其转换为矢量。

第一个.txt文件如下所示:

X Y Pixel
3 3 10
12 12 210

第二个.txt文件如下所示:

ID X Y Pixel
0  1 1  11
0  1 2  11
0  2 1  11
0  2 2  11
1  10 10 220
1  11 10 220
1  10 11 220
1  11 11 220

我已使用以下方法将它们转换为各自的矩阵:

testOne= fopen('test_file1.txt', 'r');
sizeOfTestOne = [4 Inf];
testMatrix = fscanf(testOne, '%d', sizeOfTestOne);
testMatrix = testMatrix’

testTwo = fopen('test_file2.txt', 'r');
sizeOfTestTwo = [3 Inf];
testTwoMatrix = fscanf(testTwo, '%d', sizeOfTestTwo);
testTwoMatrix = testTwoMatrix’

我想做的是:

我想使用第二个.txt文件的值为第一个.txt文件中的值提供一个ID(它将是0或1)。

我想基本上提取第二个.txt文件的整行,其中第一个.txt文件和第二个文件的X和Y值的差异是最小的。

例如,第一个:3个,3个,10个 扫描第二个.txt的值。文件..

我知道我想要的行是第4行(0,2,2,11),因为X和Y值之间的差值是1和1,它们的总和是2,小于任何值其他X和Y值。

第二行将占据最后一行,因为X和Y值之间的差异也是1和1.

所以我希望3,3,10行的ID为0,而12,12,210行的值为1。

我希望这很清楚。

1 个答案:

答案 0 :(得分:0)

稍微重写您给定的设置代码:

f1 = fopen('test_file1.txt', 'r');
m1 = (fscanf(f1, '%d', [3 Inf]))';

f2 = fopen('test_file2.txt', 'r');
m2 = (fscanf(f2, '%d', [4 Inf]))';

首先定义行与矩阵之间的度量距离:

dist = @(r, m) sum(abs(r - m), 2);

现在只需遍历m1中的所有行:

ids = zeros(size(m1, 1), 1);

for i = [1:size(m1, 1)]
    [val, idx] = min(dist(m1(i, 1:3), m2(:, 2:4)));
    ids(i) = m2(idx, 1);
end

disp(ids)

如果需要,请将m1ids联系起来:

m1 = [ids, m1];

最终结果:

 0     3     3    10
 1    12    12   210