How to find indices of certain values from dataset using a loop

11 views (last 30 days)
Hi gyus, I am a beginner in coding.
My problem is that I want to find indices of values using a loop, but having and error.
Could anyone explain what is wrong with loop and give a solution??? (file which I use is attached)
The general idea is to find 5 smallest values and its indices from the dataset (column "Lag").
clear;
data=xlsread('kNN_300_y_pred_wd XYZValue + lag.csv');
newarray = sort(data(:,5));
k=5;
values = newarray(1:k);
for i=1:k
index = find(values==data(:,5));
end

Accepted Answer

Andreas Apostolatos
Andreas Apostolatos on 23 Jan 2021
Hello,
You can use the following code snippet for your purposes:
clear;
data = readtable('kNN_300_y_pred_wd XYZValue + lag.csv');
newarray = sort(data{:,5});
k=5;
values = newarray(1:k);
for i=1:k
[~, indices] = ismember(values, data{:,5});
end
Note that I used 'readtable' instead of 'xlsread' to read-in the csv-file.
I hope that helps.
Kind Regards,
Andreas
  3 Comments
Andreas Apostolatos
Andreas Apostolatos on 24 Jan 2021
Edited: Andreas Apostolatos on 24 Jan 2021
Hello Iliqe,
My first answer was meant to address your issue about the errors you were receiving. The reason of the error was that you were trying to read-in a csv-file using function 'xlsread', which was returning an empty array that you were then trying to index. Please use function 'xlsread' to read-in xls-files.
Function 'ismember' returns the index of the first occurrence of each of the elements of the array whose elements are sought in the second array. In this case your column "Lag" has multiple occurrences of some components, such as component with value 1 and component with value 2. Therefore, function 'ismember' returns only the indices of the first occurrence of these components in your column.
From your description I believe that you would like to have all the indices of the corresponding components that appear multiple times. I would recommend the following code snippet for your purpose,
clc, clear;
data = readmatrix('kNN_300_y_pred_wd XYZValue + lag.csv');
% number of smallest numbers that are sought
num = 5;
% get the num-smallest numbers from the 5-th column of array data (Lag)
smallest_five_values_lag = sort(data(:, num));
smallest_five_values_lag = smallest_five_values_lag(1:5);
% initialize the array of indices
indices = zeros(num, 1);
% initialize counter
count = 1;
% loop over all the num-smallest numbers
for i = 1:num
% check for multi-occurrence of a component
if i > 1
if smallest_five_values_lag(i, 1) == smallest_five_values_lag(i - 1, 1)
count = count + 1;
else
count = 1;
end
end
% find the indices of the component in the 5-th column of array data (Lag)
idx = find(data(:,5) == smallest_five_values_lag(i, 1));
% place the found index in the array of indices appropriately
indices(i, 1) = idx(count);
end
Note that I herein used function 'readmatrix' to read-in csv-file directly into a numeric array instead of a table, as you already know the column that you would like to use, namely the 5th one "Lag".
You can verify that these are indeed the correct indices by means of the following command,
components = data(indices, 5)
which returns,
components =
0
1.0000
1.0000
1.4142
2.0000
These are indeed the 5 smallest elements of the 5-th column of array data, namely of the column with name "Lag".
Indeed MATLAB arrays are indexed starting from 1 and not from 0.
I hope that this information help you.
Kind Regards,
Andreas

Sign in to comment.

More Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!