Indexing to cell arrays

1 view (last 30 days)
jacob gandrup
jacob gandrup on 21 Mar 2019
Answered: Morten Jørgensen on 26 Mar 2019
Hello, i am in need of a little guidance, i hope some of you can lead me in the right direction.
I am trying to write a program that stores the coloum number in a cell. I have an array X which contains 15000x14, and i want to store all the values that are between 0 and 1.
I have written a tiny matrix to illustrate our case:
X =
0.1 3 0.2
2 5 4
1 0.3 5
%The output should look something like this with a 0 to describe when the value is between 0 and 1
1 3
0
2
In some cases there are multiple values between 0 and 1 in the same coloum and I want to store them all.
My current line of code for looks like this, and it doesnt work apropriate:
[x,y] =find(0 < X & X < 1);
  6 Comments
jacob gandrup
jacob gandrup on 21 Mar 2019
Edited: Walter Roberson on 21 Mar 2019
@Walter Roberson
Is:
output = accumarray(x, y, [], @(v) {v});
your suggestion to find to the locations? I have trouble understanding it though.. :/
Walter Roberson
Walter Roberson on 21 Mar 2019
When you use find() with two outputs, the first output is row numbers and the second output is corresponding column numbers of the locations found.
accumarray(x, y, [], @(v) {v}) is saying to use the row numbers as a grouping variable, and for each different value of x, create an internal list of corresponding y values. Then once everything is grouped, then run the function @(v) {v} on each of those lists, which wraps the list into a cell array.
The effect is the same as
maxx = max(x);
output = cell(maxx, 1);
for K = 1 : maxx
output{K} = Y(x == K);
end

Sign in to comment.

Accepted Answer

Morten Jørgensen
Morten Jørgensen on 26 Mar 2019
stepX={};
for j= 1:size(X,2)
j;
stepX{size(stepX,2)+1} = find(0 < X(:,j) & X(:,j) < 1);
end

More Answers (2)

Walter Roberson
Walter Roberson on 21 Mar 2019
output = accumarray(x, y, [], @(v) {v});

Luna
Luna on 21 Mar 2019
Edited: Luna on 21 Mar 2019
Try this:
X = [0.1 3 0.2; 2 5 4;1 0.3 5];
[xlocs,ylocs] = find(X<1 & X>0); % locations of values, you have 3 values. xlocs' first element is the row number, ylocs' first element is the column number. Both gives you the location of first value which is between 0-1. Same goes for second and third elements.
vals = nan(1,numel(xlocs)); % preallocation for values
for i = 1:numel(xlocs)
vals(i) = X(xlocs(i),ylocs(i)); % this gets you the values in x on that locations. So vals has 3 elements in this example.
end
%% At the end you can create a table like this:
myTable = table(vals',xlocs,ylocs, 'VariableNames', {'Values','XLocs','YLocs'});
myTable is like below:
myTable =
3×3 table
Values XLocs YLocs
______ _____ _____
0.1 1 1
0.3 3 2
0.2 1 3
  4 Comments
Walter Roberson
Walter Roberson on 21 Mar 2019
What they are asking for is something that has one row for each row in X, and the columns should reflect the per-row index of where the valid values were found.
The output you build can be done without loops:
[xlocs, ylocs] = find(0 < X & X < 1);
idx = sub2ind(size(X), xlocs, ylocs);
output = [X(idx), xlocs, ylocs];
Luna
Luna on 22 Mar 2019
Ah OK now I got it. Sorry for misunderstanding and thanks for explanation. Your solution works well :) +1

Sign in to comment.

Products


Release

R2018b

Community Treasure Hunt

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

Start Hunting!