Unable to perform assignment because the left and right sides have a different number of elements.
5 views (last 30 days)
Show older comments
Unable to perform assignment because the left and right sides have a different number of elements.
Error in Read_Data_File (line 15)
block(jj) = fscanf(fid, '%f', 1);
Below are two pieces of the overall code that I am working with, with the first part establishing the txt file that is read by the second part. I am receiving the above error message whenever I attempt to run the code.
clear; clc;
% Define the parameters
A = 5;
B = 6;
C = 7;
D = 3;
omega1 = 200 * 2 * pi;
omega2 = 400 * 2 * pi;
omega3 = 900 * 2 * pi;
% Define the sample frequency
fs = 10000; % Hz
% Define the time vector
t = 0:1/fs:1;
% Calculate the signal
x = A * cos(omega1 * t) + B * sin(omega2 * t) + C * cos(omega3 * t) + D;
% Save the signal to a file
filename = 'Simulated_Data_file.txt';
fid = fopen(filename, 'w');
for ii = 1:length(x)
fprintf(fid, '%f\n', x(ii));
end
fclose(fid);
clear; clc;
% Define the number of points per block
block_size = 1000;
% Open the file
filename = 'Simulated_Data_file.txt';
fid = fopen(filename, 'r');
% Read in the data
Data_File = cell(100, 1); % 100 blocks of 1000 points each
for ii = 1:100
block = zeros(block_size, 1);
for jj = 1:block_size
block(jj) = fscanf(fid, '%f', 1);
end
Data_File{ii} = block;
end
% Close the file
fclose(fid);
0 Comments
Answers (1)
Chris
on 12 Feb 2023
Edited: Chris
on 12 Feb 2023
You've hit the end of the file.
The file has 10001 data-containing lines.
Your code errors at ii==11, jj==2.
block_size (1000) x 11 + 2 = 10002.
The last line in the file is empty (which fscanf reads with a size of 0x0). Matlab is trying to add that to the jjth element in the block array, assuming a value with a size of 1x1. That's where the size mismatch occurs.
3 Comments
Chris
on 12 Feb 2023
Edited: Chris
on 12 Feb 2023
@Brandon that depends on what you're trying to accomplish.
Are you trying to fill 100 blocks of 1000, stop in the middle of a block when you reach the end of the file, or have the number of data points be a multiple of 1000 and stop at the end of a block (and stop the loop when the file is finished)?
Chris
on 12 Feb 2023
Edited: Chris
on 12 Feb 2023
Here's a guess. In the first script, do:
t = 1/fs:1/fs:1; % Or t = 0:1/fs:(1-1/fs);
In the second:
filename = 'Simulated_Data_file.txt';
fid = fopen(filename,'r');
data = fscanf(fid,'%f'); %Ignores the empty line
fclose(fid);
block_size = 1000;
temp = reshape(data,block_size,[]); % A 1000-by-N double array
% The final cell array (but do you really need this, or can you use temp?)
Data_File = num2cell(temp, 1).';
In the first script (as with reading the file) it's more in the spirit of Matlab, and possibly more efficient, to write the file without the loop:
fid = fopen(filename, 'w');
fprintf(fid, '%f\n', x);
fclose(fid);
If performance isn't a huge concern, consider using higher-level functions, which can be easier to work with:
writematrix(x.', filename);
data = readmatrix(filename);
See Also
Categories
Find more on Whos in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!