MATLAB Answers

How to loop over a customized function?

1 view (last 30 days)
Hello everyone,
I wrote a function and I would like to use it on many data at once, so I tried to use the function inside a for loop.
But I got this error
In an assignment A(:) = B, the number of elements in A and B must be the same.
Kindly find the function and my code attached with sample files.
I appreciate your help.
Note: put all the files in the same folder and run the file "semimanual_matching.m".
Basically, I need to run this line
T(n) = V2(dinfo(n).name, V(n));
for several text files, For instance, the function "V2" will run for the first text file "dinfo(1).name" and will take the first value of "V(1)" and put the result in the first cell of "T" ---> T(1).
Currently the error is
Subscripted assignment dimension mismatch.
Error in semimanual_matching (line 12)
T(n) = V2(dinfo(n).name, V(n));

  4 Comments

Show 1 older comment
Mohamed Nedal
Mohamed Nedal on 21 Dec 2019
The function works fine. The problem is in the 2nd for loop in the code.
i gives this message, I don't know what' the issue exactly.
In an assignment A(:) = B, the number of elements in A and B must be the same.
per isakson
per isakson on 21 Dec 2019
I miss an instruction on how to use your files. And I miss the file matlab.mat, which is loaded in the first line of the second section of semimanual_matching.
What release of Matlab are you running?
Mohamed Nedal
Mohamed Nedal on 21 Dec 2019
sorry, my bad!
I have edited the describtion and attached the ".mat" file.
I'm using R2017b.

Sign in to comment.

Accepted Answer

per isakson
per isakson on 21 Dec 2019
Edited: per isakson on 21 Dec 2019
I have modified semimanual_matching so that I don't need to put your text files in a new folder and include that folder in the Matlab search path. My first execution of semimanual_matching_modified produced the following output in the command window (plus two figures with diagrams).
Weak Geomagnetic Storm.
Est. arrival time is 91.6667 hours.
Exp. transit time using G2001 model
is eaither 108.73 hours or 97.69 hours.
Unable to perform assignment because the indices on the left side are not compatible with the size of the right side.
Error in semimanual_matching_modified (line 16)
T(n) = V2(dinfo(n).name, V(n));
Next I set a breakpoint at the offending line and restarted semimanual_matching_modified. The execution halted before executing T(n) = V2(dinfo(n).name, V(n));. I selected V2(dinfo(n).name, V(n)) with the mouse, right clicked and chose Evaluate Selection from the contect menu. The function V2() returned a column vector. The left hand side, T(n), is a scalar, which explains the error. A vector cannot be assigned to a scalar.
I added the line T = nan(144,3); before the for-loop, replaced T(n) by T(:,n) and clicked Run Section with the cursor at the new line. Output in the command window:
Error using line
Vectors must be the same length.
Error in V2 (line 105)
line([t(row2) t(row2)], ylim, 'LineStyle','--', 'Color', 'g');
Error in semimanual_matching_modified (line 16)
T(:,n) = V2(dinfo(n).name, V(n));
That's a different error. It occured during the third iteration of the loop. n was 3. Part of the output was lost. I guess there is a clc somewhere in the code. Line 104 and 105 of V2 reads
[row2, ~] = find (na_np > 0.08);
line([t(row2) t(row2)], ylim, 'LineStyle','--', 'Color', 'g');
I set a breakpoint at line 105 (dbstop if error didn't work???) and clicked Run Section. The execution halted and I clicked Continue twice. The third time I inspected the values involved
K>> whos row2 na_np t
Name Size Bytes Class Attributes
na_np 144x1 1152 double
row2 0x1 0 double
t 144x1 1152 double
K>> max(na_np)
ans =
0.041
K>>
The error is obviously caused by row2 being empty, which is because max(na_np) is less than 0.08. That in turn has probably something to do with the data in the third text file.
>> dinfo(3).name
ans =
'16122009.txt'
Where semimanual_matching_modified.m now reads
close all; clear; clc
%% read all txt files' names in this folder
dinfo = dir('*.txt');
cac = regexp( {dinfo.name},'^\d+(?=\.txt)', 'start' );
dinfo( cellfun( @isempty, cac ) ) = [];
% filename = zeros(length(dinfo),1);
% for k = 1:length(dinfo)
% filename = dinfo(k).name;
% end
% clear k;
%%
load('matlab.mat');
T = nan(144,3);
for n = 1:3
T(:,n) = V2(dinfo(n).name, V(n));
end
And study
/R2018b

  1 Comment

Mohamed Nedal
Mohamed Nedal on 21 Dec 2019
I modified the function and the code and they work!
Thank you so much

Sign in to comment.

More Answers (0)

Sign in to answer this question.