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

조회 수: 15 (최근 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에서 Spectral Measurements에 대해 자세히 알아보기

태그

제품


릴리스

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by