Лучший подход здесь использовать cat
вместе с comma-separted list созданной {}
индексации с получением целевого вектора-столбца. Мы определяем первое измерение как первый аргумент, так как у вас есть все векторы столбцов, и мы хотим, чтобы результат также был вектором столбца.
out = cat(1, extInt{vec})
Учитывая введенные данные, cell2mat
попытки CONCATENATE по втором измерении который потерпит неудачу для ваших данных, поскольку все данные имеют разное количество строк. Вот почему (в вашем примере) вам пришлось транспонировать данные до вызова cell2mat
.
Update
Вот тест, чтобы сравнить время выполнения между cat
и cell2mat
подходов.
function benchit()
nRows = linspace(10, 1000, 100);
[times1, times2] = deal(zeros(size(nRows)));
for k = 1:numel(nRows)
rows = nRows(k);
data = arrayfun(@(x)rand(randi([10, 50], 1), 1), 1:rows, 'uni', 0);
vec = 1:2:numel(data);
times1(k) = timeit(@()cat_method(data, vec));
data = arrayfun(@(x)rand(randi([10, 50], 1), 1), 1:rows, 'uni', 0);
vec = 1:2:numel(data);
times2(k) = timeit(@()cell2mat_method(data, vec));
end
figure
hplot(1) = plot(nRows, times1 * 1000, 'DisplayName', 'cat');
hold on
hplot(2) = plot(nRows, times2 * 1000, 'DisplayName', 'cell2mat');
ylabel('Execution Times (ms)')
xlabel('# of Cell Array Elements')
legend(hplot)
end
function out = cat_method(data, vec)
out = cat(1, data{vec});
end
function out = cell2mat_method(data, vec)
out = cell2mat(data(vec)');
end

Причина постоянной смещения между ними состоит в том, что cell2mat
вызовы cat
внутренне, но добавляет некоторую дополнительную логику поверх него. Если вы просто используете cat
напрямую, вы обойдете эти дополнительные накладные расходы.
В чем вопрос? Не работает этот код? Если нет, укажите, почему нет. – Adriaan
Прошу прощения, я отредактировал вопрос. –
Попробуйте ['cellfun'] (http://mathworks.com/help/matlab/ref/cellfun.html) – Adriaan