Unable to perform assignment because the left and right sides have a different number of elements.

3 次查看(过去 30 天)
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);

回答(1 个)

Chris
Chris 2023-2-12
编辑:Chris 2023-2-12
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 个评论
Chris
Chris 2023-2-12
编辑:Chris 2023-2-12
@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
Chris 2023-2-12
编辑:Chris 2023-2-12
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);

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Whos 的更多信息

标签

产品


版本

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by