"Intermediate dot indexing produced a comma-separated list.." error prevents extracting values from nested indexed fields

조회 수: 616 (최근 30일)
The following minimum working example illustrates a very common situation in Matlab, and shows the error produced when trying to aggregate values from across indexed fields that are themselves nested within other indexed fields.
a.students(1).grades = [7 8 9];
a.students(2).grades = [6 7 8];
max(a.students(:).grades(:)) % obtain maximum of ALL grades, from ALL students
% gives the error:
% Intermediate dot '.' indexing produced a comma-separated list with 2 values, but it must produce a single value when followed by subsequent indexing operations.
The same error is produced if I simply try to print out those values, without applying max or any other function, and putting the expression in square brackets doesn't help:
[ a.students(:).grades(:) ]
The only way to go around this is to keep using for loops, which makes code inelegant and error-prone. This seems too basic a feature to not have a built-in solution in Matlab. Would appreciate any suggestions how this could be achieved.
  댓글 수: 1
Stephen23
Stephen23 2022년 5월 18일
편집: Stephen23 2022년 5월 18일
Your code does not work because you are trying to apply one index onto multiple variables. MATLAB does not have such a command that applies one index to all members of a comma-separated list, nor is it likely to in the near future (that would be a major change in how commas and lists are interpreted).
a.students(1).grades = [7 8 9];
a.students(2).grades = [6 7 8];
a.students(:).grades % this returns multiple separate variables, not one array.
ans = 1×3
7 8 9
ans = 1×3
6 7 8
a.students(:).grades(:) % how can we apply one index to multiple arrays?
Intermediate dot '.' indexing produced a comma-separated list with 2 values, but it must produce a single value when followed by subsequent indexing operations.
Basically your code is doing something a bit like this (pseudo-code):
[7 8 9],[6 7 8](:)
with the expectation that the colon index would be applied to both members of the comma-separated list.

댓글을 달려면 로그인하십시오.

채택된 답변

Jon
Jon 2022년 5월 18일
If you want the max over all of the grades you can do it very simply like this
val = max([a.students.grades])
  댓글 수: 6
Jon
Jon 2022년 5월 18일
OK thanks for the example that helps me understand better. At least for me it is a little subtle, but this makes sense.
z8080
z8080 2022년 5월 19일
Thanks a lot Jon and Stephen. So strange that I had already thought of putting the expression in square brackets, but because I had also included the (:), that prompted the error. Also, using my MWE, the error I get now is different from the one in the thread title,namely the related one "Expected one output from a curly brace ..."
Anyway, I've learned something from this, thank you.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Alberto
Alberto 2022년 11월 3일
Sorry if I jump in the conversation, but how to I access to a single value present in that structure?

카테고리

Help CenterFile Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

제품


릴리스

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by