在一组结构中交换变量名称和字段名称,因此字段名称成为结构名称,反之亦然?

时间:2018-01-09 19:11:28

标签: matlab struct

我有一组结构都具有相同的字段名称。例如,结构ABC都有字段名称namesection。有没有办法重新安排这个数据组织,以便数据来自:

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功能的黑客并不是很好,我也不知道是否有办法让它很容易适应我拥有的变量数量。有关如何简化此过程的任何输入都会很棒。感谢。

1 个答案:

答案 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