2015-02-14 3 views
1

У меня есть два массива ячеек, как: А = {< 16x1 двойной> < 37x1 двойной> < 43x1 двойной>} и B = {< 16x1 двойной> < 37x1 double>, < 43x1 double>}. Теперь я хочу разделить каждый элемент массива ячеек A на соответствующий элемент массива ячеек B или наоборот! Если элемент массива ячеек B больше, чем элемент массива ячеек A, то это определение должно быть B./A, а затем вычислять квадратный корень из этих значений. Для двух матриц Я знаю, что я могу просто написать код ниже:Как выполнить разделение правого массива на два массива ячеек

if(a > b) 
ratio= sqrt(a ./ b); 
else 
ratio= sqrt(b ./ a); 
end 

, но я не знаю, как я могу продлить этот алгоритм для массива ячеек? Я знаю, что я могу определить два цикла для доступа к каждому вектору массива ячеек, а затем применить мой выше код, но этот алгоритм слишком медленный, и он не очень полезен для большого массива ячеек, так как я написал код, как я упоминал, и я видел, что это действительно отстой! THX за вашу помощь

+0

На самом деле ваш код не работает для матриц. Оператор if вычисляется как «all (a> b)». Это то, что вы хотите или это ошибка? – knedlsepp

ответ

5

Использование cellfun в сочетании с max и min чтобы достичь того, чего вы хотите:

C = cellfun(@(x,y)sqrt(max(x,y)./min(x,y)), A, B, 'uniformOutput',false) 

cellfun применяет функцию к каждому элементу клеток (трех массивов длиной 16, 37, и 43, соответственно). 'UniformOutput', false указывает, что вывод должен быть возвращен в массиве ячеек с тем же количеством элементов, что и входы.

@(x,y) указывает анонимную функцию, которая принимает два входных аргумента (соответствующие массивы от A и B).

max(x,y) принимает максимум соответствующих элементов массивов x и y, тем самым гарантируя, что вы всегда имеете максимум в числителе деления.

0

Один подход может быть с logical indexing внутри этих клеточных массивов -

%// Store ratios as a separate cell array 
A_B = cellfun(@(x,y) sqrt(x./y),A,B,'Uni',0) 

%// Create cell array of logical arrays storing the conditional 
C = cellfun(@(x,y) x>y,A,B,'Uni',0) 

%// Use those conditionals to choose between the ratios or their reciprocals 
out = cellfun(@(c,ab) c.*ab + ~c./ab,C,A_B,'Uni',0) 

Вы можете сделать одну гильзу из вышеизложенного подхода, хотя это потребует несколько дополнительных sqrt операций -

out = cellfun(@(x,y) (x>y).*sqrt(x./y) + (x<=y).*sqrt(y./x),A,B,'Uni',0) 
+2

Вы можете использовать 'cellfun' вместо' arrayfun' для меньшего набора текста. – Jonas

+0

@Jonas Спасибо! Это хорошее предложение. – Divakar

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