Logical Indexing a spefic column in a matrix

7 ビュー (過去 30 日間)
Patrick
Patrick 2014 年 12 月 17 日
コメント済み: Guillaume 2014 年 12 月 20 日
Hi,
I have a matrix with 5 columns and a variable number of rows (usually around 100). Column 4 of the matrix is a set of angles that can range anywhere from -180 to 180. I want to be able to create a set of smaller matrixes that splits up the larger matrix based on whether the angles fall in a 30 degree segment or not. For example a matrix that has 0 to 30 degrees, 30 to 60 degrees, 60 to 90 degrees, etc.
Can I use something like below. I don't think that will work though.
Zero_to_Thirty = A(4,:) < 30
Any help is appreciated!
Thanks,
Pat

採用された回答

Guillaume
Guillaume 2014 年 12 月 17 日
編集済み: Guillaume 2014 年 12 月 17 日
Don't store these submatrices in individual variables with different names.Rather store them in a cell array.
Use histcounts to find the distribution of the indices of the rows you want to split and arrayfun or a for loop to do the splitting:
m = rand(150, 6); m(:, 4) = randi([-180 180], 150, 1); %random matrix for demo, size 150*6
[~, ~, bins] = histcounts(m(:, 4), -180:30:180);
subm = arrayfun(@(bin) m(bins == bin, :), 1:max(bins), 'UniformOutput', false)
That last line with the arrayfun is equivalent to
subm = cell(1, max(bins));
for bin = 1:max(bins)
subm{bin} = m(bins == bin, :);
end
  5 件のコメント
Patrick
Patrick 2014 年 12 月 18 日
Ok this works fantastic. Except I forgot to mention that I actually needed the values in column 1 of the matrix in the subm cell array, that correspond to the largest values in column 5. Is there a way to keep them together?
Guillaume
Guillaume 2014 年 12 月 20 日
All the columns are present in the matrices of the subm cell array, so I'm not sure what you're asking.
If you want the value of column 1 that correspond to the maximum, use the second return value of max:
max_subm = zeros(numel(subm), 2)
lastmax = -Inf;
lastval = -Inf;
for idx = 1:numel(subm)
if ~isempty(subm{idx})
[lastmax row] = max(subm{idx}(:, 5));
lastval = subm{idx}(row, 1);
end
max_subm(idx, :) = [lastmax lastval];
end

サインインしてコメントする。

その他の回答 (1 件)

Roger Stafford
Roger Stafford 2014 年 12 月 17 日
If M is the original matrix,
c4 = M(:,4);
M1 = M(0<=c4 & c4<30,:); % <-- Having the angles between 0 and 30
M2 = M(30<=c4 & c4<60,:); % <-- Having the angles between 30 and 60
etc.
  2 件のコメント
Stephen23
Stephen23 2014 年 12 月 18 日
Surely it would be best not to split the array up into numbered variables. Doing this seems to invite the next question "how do I evaluate sequentially-numbered variable names?" which inevitably leads on to eval...
Roger Stafford
Roger Stafford 2014 年 12 月 18 日
Not necessarily. It depends on how many there are and how they are to be used.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeResizing and Reshaping Matrices についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by