Dimensioning a field within a structure array for reading data

5 vues (au cours des 30 derniers jours)
Jim McIntyre
Jim McIntyre le 15 Août 2025
Modifié(e) : Star Strider le 18 Août 2025
I am reading a file that contains a number of groups of fields and I'm trying to figure out how to do this.
I'd like to create structure (CTW) where I will group the data, but I'm running into problems defining and allocating the fields.
The first set of data in the file is an array of four variables of 8 characters each. I want to call these c8(1), through c8(4).
The second set of data in the file is 6 variables of 20 characters each. I want to call these c20(1), through c20(6).
Currently, my code looks like this:
fid = fopen(filename, 'r');
for x = 1 : 4
CTW.c8(x) = string(fread(fid, 8, '*char')');
end
for x = 1 : 6
CTW.c20(x) = string(fread(fid, 20, '*char')');
end
Matlab gives the following error:
Unable to perform assignment because the indices on the left side are not compatible with the size of the right side.
I know that I can read in the individual strings and then create the structure, like this:
c81 = string(fread(fid, 8, '*char')');
c82 = string(fread(fid, 8, '*char')');
c83 = string(fread(fid, 8, '*char')');
c84 = string(fread(fid, 8, '*char')');
CTW.c8 = [c81, c82, c83, c84];
clear c81 c82 c83 c84
end
but that seems inelegant. What is the best way to do this? Is there some way to pre-allocate the arrays within the structure?
  1 commentaire
Jim McIntyre
Jim McIntyre le 18 Août 2025
It appears that I can make this work in a slightly cumbersome way by predefining each set of variables like this:
fid = fopen(filename, 'r');
numFields = 4;
CTW.c8 = strings(numFields, 1);
for x = 1 : numFields
CTW.c8(x) = string(fread(fid, 8, '*char')');
end
numFields = 6;
CTW.c20 = strings(numFields, 1);
for x = 1 : numFields
CTW.c20(x) = fread(fid, 20, '*char');
end
I still suspect there's a better way to do this.

Connectez-vous pour commenter.

Réponse acceptée

Star Strider
Star Strider le 15 Août 2025
Modifié(e) : Star Strider le 18 Août 2025
It might be worthwhile to use the readcell function to read it.
After that, the cell2struct function could work to create a structure from it with the characteristics you want.
I am not certain how easy that might be. I have used both of these funcitons (although rarely), however I have never done what you describe.
EDIT -- (18 ,Aug 2025 at 12:07)
One way to troubleshoot this would be to read the lines in separately to see what the problem is, and then make the appropriate changes to your code.
Example --
fid = fopen(filename, 'r');
for x = 1 : 4
c8str = string(fread(fid, 8, '*char')')
CTW.c8(x) = string(fread(fid, 8, '*char')');
end
for x = 1 : 6
c20str = string(fread(fid, 20, '*char')')
CTW.c20(x) = string(fread(fid, 20, '*char')');
end
fclose(fid);
That should reveal the reason the incompatibilities exist.
Importing the lines as cell arrays could also work. That might be as simple as enclosing them in curly braces:
fid = fopen(filename, 'r');
for x = 1 : 4
CTW.c8(x) = {string(fread(fid, 8, '*char')')};
end
for x = 1 : 6
CTW.c20(x) = {string(fread(fid, 20, '*char')')};
end
fclose(fid);
.
  3 commentaires
Jim McIntyre
Jim McIntyre le 18 Août 2025
Modifié(e) : Jim McIntyre le 18 Août 2025
Your second answer seems to be the way forward. I guess I need a serious primer on the use of curly braces ;-) It works as a cell arrray of strings, or as a cell array of char arrays (below). So That's the way I'm going to go. Thank you!
fid = fopen(filename, 'r');
for x = 1 : 4
CTW.c8(x) = {fread(fid, 8, '*char')'};
end
for x = 1 : 6
CTW.c20(x) = {fread(fid, 20, '*char')'};
end
fclose(fid);
Star Strider
Star Strider le 18 Août 2025
Modifié(e) : Star Strider le 18 Août 2025
As always, my pleasure!
EDIT -- (18 Aug 2025 at 13:45)
Expanding on that, curly braces create a cell array. Cell arrays can hold different clases of variables, as well as different sizes of the same variable. It is usually straightforward to use them, however it may be necessary to use cellfun to deal with them efficiently.
.

Connectez-vous pour commenter.

Plus de réponses (1)

Walter Roberson
Walter Roberson le 15 Août 2025
Your loop code has a problem when you reach end of file. In such a case, fread() returns empty, and string(empty) returns a 0 x 0 string, which cannot be stored in a 1 x 1 destination.
  1 commentaire
Jim McIntyre
Jim McIntyre le 18 Août 2025
The problem is occurring in the very first iteration of the first loop, long before I reach the end of the file. As I said, I can read data using the other method, so there's data there, but for some reason the allocation isn't working.

Connectez-vous pour commenter.

Produits


Version

R2025a

Community Treasure Hunt

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

Start Hunting!

Translated by