MATLAB Answers

problem in applying loop

1 view (last 30 days)
Ali Asghar
Ali Asghar on 18 Sep 2019
Commented: Ali Asghar on 19 Sep 2019
I have emg signal (30000x4) and want to apply function on it in loop....
function waveLen = find_waveform_length(signal)
sum=0;
for i=2:length(signal)
sum= sum + abs(signal(i)-signal(i-1));
end
waveLen = sum;
%%%%%% New file %%%%%%%
load ('dath001.mat');
x = dath001; % 30000x4
for i = 1:4
waveLen(i) = find_waveform_length(x(i))
end
but it give output of 0 0 0 0
instead if i run waveLen function separately it give output of
463.6428 200.0671 411.7511 372.9306 ... I want this output by simple apply loop command
Thank you

  0 Comments

Sign in to comment.

Accepted Answer

Raj
Raj on 18 Sep 2019
What is the 'y' you have used in your main script loop? Its not defined anywhere. Use this line in main script:
waveLen(i) = find_waveform_length(x(:,i))
Since you have not shared your MAT file, I tried with a random 30000x4 matrix and it works.
Few other recommendations:
1) Put an 'end' for your function
2) Don't use variable 'i' or any other inbuilt Matlab variable as index in your 'for' loop.

  4 Comments

Show 1 older comment
Ali Asghar
Ali Asghar on 18 Sep 2019
Dear
now i want to apply windowing in it....
previously i did in below way
w = hann(2000);
datawindow1 = w.*buffer(y(:,1),2000,-500); % buffer is good command, read it
datawindow2 = w.*buffer(y(:,2),2000,-500);
datawindow3 = w.*buffer(y(:,3),2000,-500);
datawindow4 = w.*buffer(y(:,4),2000,-500);
but when i do it in loop like
for i = 1:4
datawindow(i) = w.*buffer(y(:,i),2000,-500)
end
it shows error
Unable to perform assignment because the indices on the left side are not compatible with the size of the right side.
Raj
Raj on 18 Sep 2019
Again you have not mentioned what is 'y' here.
Lets see your expression in the loop:
datawindow(i) = w.*buffer(y(:,i),2000,-500)
You are trying to dynamically name the variable datawindow. It is not recommended. See this:
Now coming to your error. The right side of this expression will give you a matrix of some size and you are trying to assign that to a single element of matrix datawindow hence you are getting the size mismatch error.
Wayout: Define datawindow as a cell array like this:
datawindow=cell(4,1);
Then in your loop use this expression:
datawindow(i,1) = {w.*buffer(y(:,i),2000,-500)};
Now your datawindow will have 4 matrices as cell elements. You can extract and use them like this:
datawindow1=cell2mat(datawindow(1,1));
and so on.
See these links for details:

Sign in to comment.

More Answers (0)

Sign in to answer this question.