フィルターのクリア

anyway to cat specific column using horzcat?

1 回表示 (過去 30 日間)
Yu Li
Yu Li 2019 年 9 月 2 日
コメント済み: Walter Roberson 2019 年 9 月 2 日
Hi:
I have a cell array, the size is not determined, but each array is a 1000*3 matrix.
I want to merge the 3rd column of each array into a new matrix, is there anyway to do it?
below are what I have tried:
A{1}=rand(1000,3);
A{2}=rand(1000,3);
A{3}=rand(1000,3);
result= horzcat(A{:}(:,3))
or result= [A{:}(:,3)];
but Matlab reported error: Expected one output from a curly brace or dot indexing expression, but there were 3 results.
Thanks!
Yu
  1 件のコメント
Rik
Rik 2019 年 9 月 2 日
As far as I'm aware, there is currently no way to do this directly in Matlab.
What you could do in this specific case is to cat A to the third dimension, and then select your data from the 3D array.

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

採用された回答

Walter Roberson
Walter Roberson 2019 年 9 月 2 日
res = cell2mat(cellfun(@(x) x(:,3), A, 'uniform', 0));
  4 件のコメント
Guillaume
Guillaume 2019 年 9 月 2 日
your answer works
As I commented in dpb's answer, only if the cell array is a row vector.
Walter Roberson
Walter Roberson 2019 年 9 月 2 日
res = cell2mat(cellfun(@(x) x(:,3), A(:).', 'uniform', 0));
This will work even with cell arrays that are column vectors.

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

その他の回答 (1 件)

Guillaume
Guillaume 2019 年 9 月 2 日
As others have said, no you can't do that with a single statement.
Assuming a cell array of any shape and size, rik's suggestion is probably the shortest to write:
result = cat(3, yourcellarray{:});
result = squeeze(result(:, 3, :));
The other option is cellfun indeed but without cell2mat if the cell array is not a row vector:
result = cellfun(@(m) m(:, 3), 'UniformOutput', false);
result = [result{:}];

カテゴリ

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

Community Treasure Hunt

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

Start Hunting!

Translated by