# How to merge two matrixes by position vector?

6 views (last 30 days)

Show older comments

Hey everybody,

I have two matrixes each having a x- and y-position vector, looking like this:

x1 = [1.10, 2.11, 3.07, 4.10, 5.09, 6.10, 7.12, 8.10];

x2 = [5.45, 6.43, 7.46, 8.45, 9.44, 10.42, 11.43];

y1 = [-4.30, -3.29, -2.35, -1.31, 0.30, 1.28, 2.32, 3.30];

y2 = [-3.70, -2.69, -1.67, 0.71, 1.70, 2.72, 3.71, 4.68];

A1 = randi(10, length(x1), length(y1));

A2 = randi(10, length(x2), length(y2));

The way I was doing it until now:

- I was looking for the x-overlap, assuming same resolution (diff(x1) is approximately diff(x2))

diff = abs(x1 - x2);

x_idx = find(diff == min(diff));

overlap_x = x_idx : length(x1); %(A1 is normally at front position)

2. comparing the length of y1 and y2, assuming that they nearly show the same positions

if length(y1) > length(y2), y_final = length(y1);

else, y_final = length(y2);

end

3. and created a new matrix with A1 and A2 with both overlapping at their position

m_final = zeros(length(x1) + length(x2) - length(overlap_x), y_final);

%filling in A1

m_final(1:length(x1), 1:length(y1)) = A1;

%overlapping area is averaged

m_final(overlap_x , 1:length(y2)) = (m_final(overlap_x , 1:length(y2)) + A2(1:length(overlap_x), 1:length(y2)))/2;

%remaining part

m_final(overlap_x(end)+1 : x_idx+length(x2) -1, 1:length(y2) ) = ...

A2(length(overlap_x)+1:length(x2) , 1:length(y2));

But this is not quite accurate, the y2-vector can picture a position of matrix A2 which is a bit lower or higher or wider than A1. I tried to handle it with different cases (y2(1)<y1(1) and 2(end)<y1(end)) but ended up in a terrible mess. So my question is now, which (easy and clear ^^) approach would you propose to handle the y-position and the overlapping area so that the outcome could look like the attached picture? I also added some example data. (It already looks a bit like the picture downstream, but I need this approach to combine a lot of those matrices together.)

##### 0 Comments

### Answers (1)

Benjamin Großmann
on 3 May 2021

Maybe this works. Hard to tell because the randi images are not so comparable to your image.

Basic idea is to combine the coordinates x1 and x2 into x as well as y1 and y2 into y. Then sort x and sort y and find the values of x1,x2,y1,y2 in x and y to get indices. These indices should correspond to the place where A1 and A2 have to be in the merged matrix A.

clearvars

close all

clc

%% Definitions

x1 = [1.10, 2.11, 3.07, 4.10, 5.09, 6.10, 7.12, 8.10];

x2 = [5.45, 6.43, 7.46, 8.45, 9.44, 10.42, 11.43];

y1 = [-4.30, -3.29, -2.35, -1.31, 0.30, 1.28, 2.32, 3.30];

y2 = [-3.70, -2.69, -1.67, 0.71, 1.70, 2.72, 3.71, 4.68];

A1 = randi(10, length(x1), length(y1));

A2 = randi(10, length(x2), length(y2));

% Initialize the merged matrix with NaN

A = NaN(numel(y1) + numel(y2), numel(x1) + numel(x2));

% combine x1, x2

x = [x1 x2];

% combine y1, y2

y = [y1 y2];

% sort the combined coordinates

x = sort(x);

y = sort(y);

% Use ismember to get the indices of x1 in x

[~, A1_x] = ismember(x1, x);

% Use ismember to get the indices of y1 in y

[~, A1_y] = ismember(y1, y);

% Use ismember to get the indices of x2 in x

[~, A2_x] = ismember(x2, x);

% Use ismember to get the indices of y2 in y

[~, A2_y] = ismember(y2, y);

% Write A1 at the corresponding position in A

A(A1_x, A1_y) = A1;

% Write A2 at the corresponding position in A

A(A2_x, A2_y) = A2;

figure

imagesc(x1, y1, A1)

figure

imagesc(x2, y2, A2)

figure

imagesc(x, y, A)

Another approuch would be to define a common mesh and use interp2 to place the two pictures onto these mesh or to use imfuse if you have the Image Processing Toolbox.

##### 1 Comment

Liz Lala
on 5 May 2021

### See Also

### Categories

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!