Structfun with multiple inputs
15 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Alec Huynh
el 28 de Jun. de 2021
Comentada: Alec Huynh
el 29 de Jun. de 2021
Hello!
I hope your day is going well. I have an issue I am unable to succinctly describe, so I will instead demonstrate it.
Let's say I have two structures:
A.a = zeros(10, 10, 10) + 1; % 3d all 1s
A.b = zeros(10, 10, 10) + 2; % 3d all 2s
A.c = zeros(5, 5) + 3; % 2d all 3s
B.a = zeros(10, 10, 10) + 1; % 3d all 1s
B.b = zeros(10, 10, 10) + 1; % 3d all 1s
B.c = zeros(5, 5) + 1; % 2d all 1s.
As can be seen, A and B have the same size for each respective array in their structure. Ex. A.a is the same size as B.a. However, A.a and B.c are not the same size (A.a being 3d and B.c being 2d).
I would like to subtract each array with these two structures from each other. If I were doing only one array, it would look something like this:
C = bsxfun(@minus, A.a, B.a);
This returns a 3d array with all zeros since A.a and B.a are exactly equal.
I would like to do this for A.a - B.a, A.b - B.b, A.c - B.c, etc. In this example I have only 3 arrays in the strucutre for the sake of brevity and simplicity, but in my actual I have several arrays in each structure. I understand I could write a For Loop which iterates through each name in the structure, but I feel that using the Structfun and Bsxfun I could do this in significantly less code in a much less complicated way. However, I am unsure how to use Structfun such that I have two structures as inputs. Could you help me figure this out?
Any suggestions would be greatly appreciated. Thank you!
5 comentarios
Stephen23
el 29 de Jun. de 2021
Editada: Stephen23
el 29 de Jun. de 2021
@Alec Huynh: sure converting to cell works, but is a fragile solution (it loses the fieldnames), is more complex than if STRUCTFUN actually accepted any number of structures, and adds some overhead (creating cell header in memory).
Note that overloading MINUS is not required, you can just run that code on those structures.
Respuesta aceptada
Nikhil Sapre
el 28 de Jun. de 2021
Hi Alec,
You can overload the minus function for structures and then return a structure from it.
Implement the function below and save it in a seperate file
function C = minus(A,B)
C = cellfun(@minus,struct2cell(A),struct2cell(B),'UniformOutput',false); %# Apply plus cell-wise
C = cell2struct(C,fieldnames(A));
end
A.a = zeros(10, 10, 10) + 1; % 3d all 1s
A.b = zeros(10, 10, 10) + 2; % 3d all 2s
A.c = zeros(5, 5) + 3; % 2d all 3s
B.a = zeros(10, 10, 10) + 1; % 3d all 1s
B.b = zeros(10, 10, 10) + 1; % 3d all 1s
B.c = zeros(5, 5) + 1; % 2d all 1s.
C = A - B %should give you the expected result
Thanks,
Nikhil
2 comentarios
Más respuestas (0)
Ver también
Categorías
Más información sobre Cell Arrays en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!