Compare two meshes for difference in values
13 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Guillaume
2019-8-22
编辑:Guillaume
2019-8-22
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 个评论
Guillaume
2019-8-22
编辑:Guillaume
2019-8-22
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.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!