Argument to dynamic structure reference must evaluate to a valid field name

239 visualizaciones (últimos 30 días)
Here is a code snippet that results in the error message recorded in my question. The program passes the if clause that starts
if isfield...
but baulks (North America: balks) at the next line. I hope that it is obvious to a human reader what I am trying to do. How do I make it obvious to Matlab? Have I given enough info so that someone can help me? I would be happy to give more if required.
for fldn={'raw','scl','svd','pft'}
if isfield(R,(fldn))
err = X*(R.(fldn).coef - Y);
R.(fldn).err = num2cell(mean(err.^2));
end
end
Here are some answers given by the Matlab debugger:
fldn
ans='raw'
R.fldn;
Reference to a non-existent field
R.(fldn);
Argument to dynamic structure reference must evaluate to a valid field name.
R.raw
ans=coef: {[21x1 double]}

Respuesta aceptada

Steven Lord
Steven Lord el 26 de Jun. de 2016
Display the contents of fldn as well as the class of fldn on the line immediately after the start of the for loop.
mystruct.('abc') = 1 % valid dynamic field name
mystruct.({'def'}) = 2; % NOT a valid dynamic field name
If you want to use fldn as a dynamic field name, you need to extract the char array inside the cell.
x = {'ghi'};
mystruct.(x{1}) = 3;
  1 comentario
Walter Roberson
Walter Roberson el 27 de Jun. de 2016
To expand on this: when you use
for fldn={'raw','scl','svd','pft'}
then for iterates over the columns of the resulting array, and because it is a cell array, each of the columns is a cell array. Your loop variable is not going to be set to strings in turn: it is going to be set to cell arrays that happen to contain one element that is a string.
If you had had
for fldn = {'raw', 'scl'; 'svd', 'pft'}
then because for iterates over columns, the variable would first be set to {'raw'; 'svd'} and then to {'scl' ; 'pft'} .
It does not do what one might prefer, but it is consistent behavior.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Structures en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by