Compare two meshes for difference in values
9 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Bob Thompson
am 22 Aug. 2019
Kommentiert: Bob Thompson
am 22 Aug. 2019
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.
0 Kommentare
Akzeptierte Antwort
Guillaume
am 22 Aug. 2019
Bearbeitet: Guillaume
am 22 Aug. 2019
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)
3 Kommentare
Guillaume
am 22 Aug. 2019
Bearbeitet: Guillaume
am 22 Aug. 2019
You would use
[s(nonscalarindices).somefield] = something
to assign to multiple elements (at nonscalarindices) of a structure array. somefield must be horizontally concatenable (is that a word?).
eg:
data = struct('name',{'Original','Layered'});
[data.name] = deal('NewNameA', 'NewNameB'); %typically instead of deal you'd use a comma-separated list
would put new values in name (remember that data.name is the same as data(1:end).name)
For assignin to a scalar structure such as data(1), the brackets don't do anything and made me wonder if you meant to do something else.
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!