我有一组结构都具有相同的字段名称。例如,结构A
,B
和C
都有字段名称name
和section
。有没有办法重新安排这个数据组织,以便数据来自:
A.name = 'bb';
A.section = 199;
B.name = 'joe';
B.section = 101;
C.name = 'rob';
C.section = 33;
到此:
name =
A: 'bb'
B: 'joe'
C: 'rob'
section =
A: 199
B: 101
C: 33
例如,我现有的代码就像这样运行:
% ORIGINAL STRUCTS
A.name = 'bb';
A.section = 199;
B.name = 'joe';
B.section = 101;
C.name = 'rob';
C.section = 33;
% CREATE VARIABLE NAMES FOR NEW STRUCTS
oldFNames = fieldnames(A); % old field names
oldVNames{1} = varname(A); % old variable names
oldVNames{2} = varname(B);
oldVNames{3} = varname(C);
% RESTRUCTURE STRUCTS (SWITCH FIELDNAMES AND VARIABLE NAMES)
for j = 1:length(oldFNames)
for k = 1:length(oldVNames)
eval([oldFNames{j} '.' oldVNames{k} ' = ' oldVNames{k} '.' oldFNames{j}]);
end
end
function out = varname(var) % Function to get variable name
out = inputname(1);
end
我发现使用varname
功能的黑客并不是很好,我也不知道是否有办法让它很容易适应我拥有的变量数量。有关如何简化此过程的任何输入都会很棒。感谢。
答案 0 :(得分:1)
在函数中执行 all 会更容易,而不是仅仅使用函数来获取输入变量名称。这是一个解决方案:
function invert_struct(varargin)
varNames = arrayfun(@inputname, 1:nargin, 'UniformOutput', false); % Get input names
s = [varargin{:}]; % Combine inputs into a structure array
for f = fieldnames(s).' % Loop over fields
assignin('caller', f{:}, cell2struct({s.(f{:})}, varNames, 2));
end
end
你会这么称呼它,不管你喜欢多少输入:
invert_struct(A, B, C, ...);
该函数使用assignin
在调用函数中创建新变量,并使用cell2struct
从字段数据和旧变量名创建新结构。请注意,它还使用dynamic field names。