如何对不同尺寸向量执行值相减并使用min进行查找(Matlab场景)
搞定不同尺寸矩阵的数值相减与min查找问题
嘿,先理清楚你手里两个矩阵的结构哈:
- 第一个矩阵
testMatrix:是2行3列的,每行对应一组X,Y,Pixel数据(就是你第一个txt里的3 3 10和12 12 210) - 第二个矩阵
testMatrix2(先把你没写完的读取代码补全,咱们先拿到完整矩阵):是8行4列,每行是ID,X,Y,Pixel,对应你第二个txt里的8组数据
因为俩矩阵尺寸不一样,直接硬减肯定报错,核心思路是先按坐标(X,Y)找到两个矩阵里匹配的行,再对对应的Pixel值做减法,之后用min找结果就行。
第一步:先把第二个矩阵的读取代码补全
你之前的代码没写完,先把这部分搞定,顺便记得关闭文件(不然容易留隐患):
testTwo = fopen('test_file2.txt', 'r'); sizeOfTestTwo = [4 Inf]; % 因为每行是4个元素:ID、X、Y、Pixel testMatrix2 = fscanf(testTwo, '%d', sizeOfTestTwo); testMatrix2 = testMatrix2'; % 转置后变成8行4列的矩阵,每行对应一组数据 fclose(testTwo); % 关闭第二个文件 fclose(testOne); % 第一个文件也别忘了关哦
第二步:按坐标匹配,计算Pixel差值
咱们要找的是两个矩阵里X、Y坐标相同的行,然后拿它们的Pixel值相减。用Matlab的ismember函数就能轻松搞定坐标匹配:
% 先把两个矩阵的坐标列提出来 coords1 = testMatrix(:,1:2); % testMatrix里的X、Y列 coords2 = testMatrix2(:,2:3); % testMatrix2里的X、Y列(第1列是ID,跳过) % 找出coords1里每个坐标在coords2中的位置 [isMatch, idx] = ismember(coords1, coords2, 'rows'); % 只保留匹配成功的行,计算Pixel差值(这里是testMatrix2减testMatrix,你可以换成反过来) matched_pixel1 = testMatrix(isMatch, 3); matched_pixel2 = testMatrix2(idx(isMatch), 4); pixel_diff = matched_pixel2 - matched_pixel1;
第三步:用min函数找最小差值
现在pixel_diff就是所有匹配成功的Pixel差值数组,直接用min就能拿到最小值和它的位置:
[min_diff, min_idx] = min(pixel_diff); % 咱们可以把结果打印出来,看得更清楚 fprintf('最小差值是:%d\n', min_diff); fprintf('对应的坐标(X,Y)是:(%d,%d)\n', coords1(isMatch(min_idx),1), coords1(isMatch(min_idx),2)); fprintf('testMatrix里的Pixel值:%d,testMatrix2里的Pixel值:%d\n', matched_pixel1(min_idx), matched_pixel2(min_idx));
额外处理:如果有重复坐标的情况
你第二个矩阵里ID为0的行都是重复的坐标(比如(1,1)出现了两次),要是你想先把相同坐标的Pixel值聚合一下(比如取平均、求和)再做减法,可以这么搞:
% 先把testMatrix2里的唯一坐标找出来 unique_coords2 = unique(coords2, 'rows'); agg_pixel2 = zeros(size(unique_coords2,1),1); % 对每个唯一坐标,计算对应的Pixel均值(也可以换成sum、max之类的) for i = 1:size(unique_coords2,1) mask = ismember(coords2, unique_coords2(i,:), 'rows'); agg_pixel2(i) = mean(testMatrix2(mask,4)); end % 再和testMatrix的坐标匹配计算差值 [isMatch, idx] = ismember(coords1, unique_coords2, 'rows'); pixel_diff = agg_pixel2(idx(isMatch)) - testMatrix(isMatch,3); [min_diff, min_idx] = min(pixel_diff);
这样就能完美解决不同尺寸矩阵的对应值相减,还能用min找到你要的最小值啦~
内容的提问来源于stack exchange,提问作者user9145305
相关产品推荐
相关产品推荐

