Indexing to cell arrays
1 次查看(过去 30 天)
显示 更早的评论
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 个评论
Walter Roberson
2019-3-21
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
采纳的回答
Morten Jørgensen
2019-3-26
stepX={};
for j= 1:size(X,2)
j;
stepX{size(stepX,2)+1} = find(0 < X(:,j) & X(:,j) < 1);
end
0 个评论
更多回答(2 个)
Luna
2019-3-21
编辑:Luna
2019-3-21
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 个评论
Walter Roberson
2019-3-21
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
2019-3-22
Ah OK now I got it. Sorry for misunderstanding and thanks for explanation. Your solution works well :) +1
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrix Indexing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!