Index exceeds matrix dimensions

Index exceeds matrix dimensions.
Error in tvf_emd (line 47)
y = [fliplr(y(2:2+num_padding-1)) y fliplr(y(end-num_padding:end-1))]; % padding to deal with boundary effect (symmetric).
trying to solve this problem in my code but im finding it difficult. Please can anyone help solve this problem for me. its urgent as I need to complete my paper.
attached are the codes and data used.

Answers (2)

num_padding = round(length(temp_x)*0.5);% padding number
length is defined as:
temp = size(TheInput)
if any(temp == 0)
length is 0 no matter what the other dimensions are
else
length is max(temp)
end
length is not any particular dimension: for a matrix that is not empty, length is the largest dimension.
You then use effectively go row by row through temp_x, with the rows being length 231, which is less than num_padding, so using num_padding exceeds the end of the row.

7 Comments

Please I am very grateful for your help. Please the error occurs using the code you helped with.
Error using length
Too many input arguments.
Error in tvf_emd (line 52)
length is max(temp)
could this be from my input size? I used (231,500) as the input you specified in the code.
The definition of length that I gave is pseudocode, not MATLAB code.
You need to change
num_padding = round(length(temp_x)*0.5);% padding number
to one of
num_padding = round(size(temp_x,1)*0.5);% padding number
or
num_padding = round(size(temp_x,2)*0.5);% padding number
At the moment I do not have time to figure out which of the two is appropriate for you.
I am much humbled and grateful for your support and time. both the second code on the num_padding works BUT an error occurs at some point.
num_padding = round(size(temp_x,1)*0.5);% padding number
y = temp_x
flag_stopiter=0;
for iter=1:100;
y = [fliplr(y(2:2+num_padding-1)) y fliplr(y(end-num_padding:end-1))]; % padding to deal with boundary effect (symmetric)
The below is the error:
Error using horzcat
Dimensions of matrices being concatenated are not consistent.
Error in tvf_emd (line 48)
y = [fliplr(y(2:2+num_padding-1)) y fliplr(y(end-num_padding:end-1))]; % padding to deal with boundary effect (symmetric)
please not that I have removed the transpose of y. ie y=y.';
again the new code and data is attached.
Please I still need your assistance.
You removed the "for" loop on y, so now you are deriving y from y = temp_x which is a 2D array. But your line
y = [fliplr(y(2:2+num_padding-1)) y fliplr(y(end-num_padding:end-1))]; % padding to deal with boundary effect (symmetric)
indexes y with a single index, which often implies that you are thinking of it as a vector rather than a 2D array (it is permitted to index a 2D array with a single index, and there are some very good reasons to do so, but you need to be careful with it.)
With y being a 2D array, when you index it with a vector, the result is going to be a column vector. You fliplr() the column vector, which leaves it unchanged. (In your previous version with the for y, y would have been a column vector instead of 2D, so the fliplr() would have been wrong for it too.) For column vectors you would want to use flipud()
You take that column vector and try to horzcat() it with the full 2D y array. That can only work if the extracted column vector has exactly the same number of rows as y has, which it will not have. You also have the fliplr() issue at the end of the line as y(end....) is again a single index into a 2D array and that is going to return a column vector.
If you somehow were managing to match the number of rows in the parts, then you would be horzcat a single column, then a 2D array, then a single column, and the result would be a 2D array that had 2 more columns than the original array. It is not obvious that would be your intention.
Thanks alot for your explaination and concern. At this point Im lost of ideas. I even tried reshaping and transposing y into a row vector but yet that did not work.
num_padding = round(length(temp_x)*0.5);% padding number
y = temp_x
reshape(y,1,[]);
transpose (y);
y.'
y(:)
reshape(y.',1,[]);
flag_stopiter=0;
for iter=1:100;
y = [fliplr(y(2:2+num_padding-1)) y fliplr(y(end-num_padding:end-1))]; % padding to deal with boundary effect (symmetric)
At this juncture I want anyway possible that I can run this code on this data. I am at the final stage of my research paper but this issue is raisng fustrations.
I am pleased with your help. I hope you can run code and see how best I can solve this problem with this data.
Using length() is always wrong for this purpose.
I am not clear as to why you removed the for y loop ?
The code does not have enough documentation for me to understand what you want to do.
Did you remove the for y loop in an attempt to vectorize the calculations?
tt=1:numel(y);
ind_remov_pad=num_padding+1:numel(y)-num_paddi
That code is wrong for 2D arrays y.
It looks to me as if the best way to proceed would be to use a for loop whose indices were the row numbers of temp_x, and inside the loop,
y = temp_x(row_number, :);
After which you do the padding and so on.

Sign in to comment.

Once again I am more than grateful. I only removed the for loop because originally the for loop wasnt there. I added the for loop to convert y into a row vector which stil didnt work. I have replaced it and tried it with the 'size' instead of length but same error still occurs.
I think I have taken alot of your time so I hope on your leisure time you can try to run the data on the code to feel how best this can be solved. The code run on tvf_emd(x) as the input variable . so x is the data I have attached. Also both the tvf_emd and splinfit work together.
Thanks alot .

3 Comments

It looks to me as if the best way to proceed would be to use a for loop whose indices were the row numbers of temp_x, and inside the loop,
y = temp_x(row_number, :);
After which you do the padding and so on.
As in
for row_number = 1 : size(temp_x,1)
y = temp_x(row_number, :);
y = [fliplr(y(2:2+num_padding-1)) y fliplr(y(end-num_padding:end-1))]; % padding to deal with boundary effect (symmetric)
....
end
I am grateful. I have all means but I finally decided to use the strnum to convert the data to numeric. this courses a problem I hope you wil have idea about:
Index of element to remove exceeds matrix dimensions.
Error in tvf_emd (line 131)
imf(nimf:MAX_IMF,:)=[]
again the data and code is attached.
num_padding = round(length(temp_x)*0.5);% padding number
y = temp_x;
y = temp_x(row_number, :);
flag_stopiter=0;
for iter=1:100
for row_number = 1 : size(temp_x,1)
y = temp_x(row_number, :);
y = [fliplr(y(2:2+num_padding-1)) y fliplr(y(end-num_padding:end-1))]; % padding to deal with boundary effect (symmetric)
end
Undefined function or variable "row_number".
Error in tvf_emd (line 44)
y = temp_x(row_number, :);
Please in this case how should the roe_number be defined?

Sign in to comment.

Tags

Asked:

on 17 Sep 2019

Community Treasure Hunt

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

Start Hunting!