MATLAB: Compare two meshes for difference in values

3d griddifferencelogic indexingMATLAB

I feel like I should know how to do this, but apparently I don't have the patience to figure it out today.
I have two 'mesh grids' with assigned values in mx4 and nx4 arrays. I would like to compare the result values, column 4, for points which have the same coordinate values, columns 1:3. I can identify the coordinates of the points which are the same using intersect, but my attempts at getting the difference in result values through logic indexing have been unsuccessful.
data = struct('name',{'Original','Layered'});
[data(1).nums] = randi(100,100,4);
[data(2).nums] = randi(100,200,4);
rs = intersect(data(1).nums(:,1:3),data(2).nums(:,1:3),'rows');
compared = [rs,find(data(1).nums(data(1).nums(:,1:3)==rs,4))-find(data(2).nums(data(2).nums(:,1:3)==rs,4))];
Error: Matrix dimensions must agree.
I don't care that much about fixing this error specifically, if somebody knows a better way to do the comparison, this was just where my train of thought went.

Best Answer

Strange way to fill your structure! Why the []?
[rs, wherein1, wherein2] = intersect(data(1).nums(:, 1:3), data(2).nums(:, 1:3), 'rows');
compared = [rs, data(1).nums(wherein1, 4) - data(2).nums(wherein2, 4)]
Note that this assumes that the coordinate triplets are only common once. If not, intersect is probably not the right function depending on what you want to do.
edit: Another way, which may be better for visualisation is to convert to table and innerjoin them (which is basically an intersect):
original = array2table(randi(100, 100, 4), 'VariableNames', {'X', 'Y', 'Z', 'Values'});
layered = array2table([randi(100, 200, 4); [original{randperm(100, 10), 1:3}, randi(100, 10, 1)]], 'VariableNames', {'X', 'Y', 'Z', 'Values'});
common = innerjoin(original, layered, 'Keys', 1:3);
common.difference = common.(4) - common.(5)