2017-01-04 11 views
2

Моя задача теперь хотим построить ячейку C которые содержат матрицы, первые размеры, содержащиеся в вектореПостроить клетка, которая содержит различные размеры матриц различной размерности

n = [12 23 54].

В то время как их вторые размеры фиксируются с

r = 3.

Итак, я хочу Клетка C = {rand(12,3), rand(23,3), rand(54,3)}.

Я знаю for-loop может служить своей цели, как:

C=cell(3,1) % pre-allocation 

for i = 1 : length(n) 
    C{i} = rand(n(i),r); 
end 

Могу ли я узнать, могу ли я это сделать умнее без использования в Matlab с for loop? Спасибо

ответ

1

Там действительно нет вреда в использовании for цикла в данном конкретном случае (и в большинстве случаев, когда единственной альтернативой является cellfun или arrayfun) as it is easier for MATLAB's JIT compiler to handle, но если вы действительно прочь для цикла вы можете использовать arrayfun в сочетании с неравномерным выходом, чтобы дать вам результат, который вы хотите.

C = arrayfun(@(x)rand(x, r), n, 'UniformOutput', false); 

Это может быть на самом деле медленнее, чем для цикла по причинам, указанных выше. Но эй, это одна строка, так что все это имеет значение!

+0

Большое вам спасибо и ваше введение в команду 'arrayfun' для меня. – nam

+0

«Никакой вред в использовании цикла' for' не является чрезмерно общим утверждением. В этом контексте (массивы ячеек) нет никакого вреда. В других контекстах, таких как вычисления числовых массивов, тогда есть * несколько * особых случаев, для маркеров только маргинальное наказание, но обычно это огромные преимущества, чтобы избежать их. – jez

+0

@jez Поверьте мне, я хорошо знаю. Я предположил, что, поскольку я отвечал на * конкретный вопрос, можно было предположить, что этот комментарий имел непосредственное отношение к проблеме. – Suever

1

for и while Петли имеют свое место, даже в Матлабе. Вам, вероятно, сказали, чтобы избежать их, потому что векторизованные операции намного быстрее, когда вы повторяете строки, столбцы или другие измерения упакованного числового массива. Но с конструкциями более высокого уровня, такими как массивы ячеек, часто нет преимуществ (и штрафа читабельности), чтобы пытаться делать все в аккуратных квази-векторизованных утверждениях. Возможно, ваше существующее решение - лучший подход.

1

Более короткой альтернатива, просто для удовольствия:

C = mat2cell(rand(sum(n),r), n,r)'; 

Но простой цикл почти наверняка самого быстрых в этом случае, поскольку mat2cell использует цикл, а также обильные проверки на его входы.