2016-09-23 2 views
0

Можно ли использовать cellfun с условным. Например, у меня есть массив ячеек 144x53, где первые четыре столбца имеют строку типа, остальные - поплавки. Однако среди чисел есть пустые ячейки. Интересно, можно ли использовать cellfun (@ (x) sqrt (x), cellarray) с моим массивом. Как известно, это невозможно из-за строк и пустых ячеек. В противном случае это решение, которое я использую,cellfun с условными обозначениями в MATLAB

for n = 1:length(results) 
    for k = 1:length(results(1,:)) 
     if ~isstr(results{n,k}) 
      results{n, k} = sqrt(results{n,k}); 
     end 
    end 
end 

В противном случае, можно ли векторизировать здесь?

+0

Почему бы вам просто не отфильтровать свою строку и NaNs? – GameOfThrows

+0

Посмотрите на ответ Сьювера, он решает его и эквивалентен. – GameOfThrows

ответ

0

Вы можете создать логический массив, проверив, является ли каждый элемент числовым. И затем используйте это для выполнения операции cellfun в подмножестве массива ячеек, который содержит числовые данные.

C = {1, 2, 'string', 4}; 

% Logical array that is TRUE when the element is numeric 
is_number = cellfun(@isnumeric, C); 

% Perform this operation and replace only the numberic values 
C(is_number) = cellfun(@sqrt, C(is_number), 'UniformOutput', 0); 

% 1 1.4142 'string' 2 

Как отметил @excaza, вы можете также рассмотреть вопрос о выходе его как цикл, поскольку это более производительным на более новых версиях MATLAB (R2015b и новее).

+1

Стоит отметить, что подход эквивалентных циклов работает быстрее в более новых версиях MATLAB ([gist] (https://gist.github.com/sco1/1a0242681a43569e70c1f7ad82352b16)) – excaza

+0

Отличное решение – Augusti

+0

Примечание приняты @excaza & Suever. Thanx. – Augusti

Смежные вопросы