Indexing to cell arrays

3 ビュー (過去 30 日間)
jacob gandrup
jacob gandrup 2019 年 3 月 21 日
回答済み: Morten Jørgensen 2019 年 3 月 26 日
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 件のコメント
jacob gandrup
jacob gandrup 2019 年 3 月 21 日
編集済み: Walter Roberson 2019 年 3 月 21 日
@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 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
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

その他の回答 (2 件)

Walter Roberson
Walter Roberson 2019 年 3 月 21 日
output = accumarray(x, y, [], @(v) {v});

Luna
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
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
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 ExchangeMatrix Indexing についてさらに検索

製品


リリース

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by